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

  1.  
  2. ; Listing5b.s    SCROLLEN EINES BILDES NACH LINKS UND RECHTS MIT DEM $dff102
  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, Routine der EXEC, die Libraris
  11.                 ; öffnet, und als Resultat in d0 die Basisadr.
  12.                 ; derselben Bibliothek liefert, ab welcher
  13.                 ; die Offsets (Distanzen) zu machen sind
  14.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  17.                 ; des Betriebssystemes (immer auf $26 nach
  18.                 ; GfxBase)
  19.  
  20. ;    POINTEN AUF UNSERE BITPLANES
  21.  
  22.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse von unserer PIC
  23.                 ; bzw. wo ihr erstes Bitplane beginnt
  24.  
  25.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  26.                 ; Pointer der Copperlist
  27.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  28.                 ; für den DBRA - Zyklus
  29. POINTBP:
  30.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  31.                 ; Adresse ins richtige Word der Copperlist
  32.     swap    d0        ; vertauscht die 2 Word in d0 ( 1234 > 3412)
  33.  
  34.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  35.                 ; Plane in das richtige Word in der Copperlist
  36.     swap    d0        ; vertauscht erneut die 2 Word von d0
  37.     ADD.L    #40*256,d0    ; Zählen 10240 zu D0 dazu, somit zeigen wir
  38.                 ; auf das zweite Bitplane (befindet sich direkt
  39.                 ; nach dem ersten), wir zählen praktisch Länge
  40.                 ; eines Plane dazu
  41.  
  42.     addq.w    #8,a1        ; a1 enthält nun die Adresse der nächsten
  43.                 ; Bplpointers in der    Copperlist, die es
  44.                 ; einzutragen gilt
  45.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (D1= bitplanes)
  46.  
  47.  
  48.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  49.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  50.  
  51.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  52.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  53.  
  54. mouse:
  55.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  56.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  57.  
  58.  
  59.     bsr.s    BewegeCopper    ; Scrollt Bild hin und her. Hier: COMMODORE
  60.  
  61.  
  62.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  63.     beq.s    Warte        ; überspringe die Scrollroutine
  64.  
  65.     bsr.w    BewegeCopper2    ; Bewegt das Bild maximal 16 Pixel links
  66.                 ; oder rechts, unter Verwendung des $dff102
  67.                 ; hier: der Schriftzug AMIGA
  68.  
  69. Warte:
  70.     cmpi.b    #$ff,$dff006    ; Sind wir noch auf Zeile 255?
  71.     beq.s    Warte        ; Wenn ja, geh nicht weiter
  72.  
  73.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  74.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  75.  
  76.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  77.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  78.  
  79.     move.l    4.w,a6
  80.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  81.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  82.                 ; (Libraries werden geöffnet UND geschlossen!)
  83.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  84.     rts
  85.  
  86. ; DATEN
  87.  
  88.  
  89. GfxName:
  90.     dc.b    "graphics.library",0,0    
  91.  
  92. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  93.     dc.l    0    ; ab hier werden die Offsets gemacht
  94.  
  95. OldCop:             ; Hier hinein kommt die Adresse der Orginal-Copperlist
  96.     dc.l    0    ; des Betriebssystemes
  97.  
  98.  
  99. ;    Questa routine sposta la scritta "COMMODORE", agendo su MIOCON1
  100.  
  101.  
  102. BewegeCopper:
  103.     TST.B    FLAG        ; Müßen wir vor oder zurück? Wenn FLAG NULL
  104.                 ; ist (TST also BEQ ergibt), dann springen wir
  105.                 ; nach Vorne, wenn es hingegen auf $FF ist,
  106.                 ; (TST also nicht BEQ ergibt), dann fahren wir
  107.                 ; mit dem zurückgehen fort (mit den sub)
  108.     beq.w    Vorne
  109.     cmpi.b    #$00,MeinCon1    ; sind wir auf der Standartposition angekommen,
  110.                 ; also ganz hinten?
  111.     beq.s    GehNachVorne    ; wenn ja, dann müßen wir nach vorne!
  112.     sub.b    #$11,MeinCon1    ; wir ziehen 1 vom Scroll der geraden/ungeraden
  113.     rts            ; Bitplanes ab ($ff,$ee,$dd,$cc,$bb,$aa,$99..)
  114.                 ; gehen somit nach LINKS
  115. GehNachVorne:
  116.     clr.b    FLAG    ; Durch Nullsetzen des FLAG wird bei TST.B FLAG
  117.     rts        ; das BEQ die Routine nach Vorne springen lassen, und
  118.             ; das Bild wird vorschreiten (nach rechts)
  119.  
  120. Vorne:
  121.     cmpi.b    #$ff,MeinCon1    ; Sind wir beim Maximalscroll nach vorne ($ff)
  122.                 ; angekommen?? ($f gerade und $f ungerade)
  123.     beq.s    GehNachHinten    ; wenn ja müßen wir zurückgehen
  124.     add.b    #$11,MeinCon1    ; zähle 1 zum Bitplanescroll dazu, gerade und
  125.                 ; ungerade ($11,$22,$33,$44 etc..)
  126.     rts            ; GEH NACH RECHTS
  127.  
  128. GehNachHinten:
  129.     move.b    #$ff,FLAG    ; Wenn das Label FLAG nicht auf NULL ist,
  130.     rts            ; dann bedeutet das, daß wir nach links
  131.                 ; zurückgehen müßen
  132.  
  133. ;    Dieses Byte ist ein FLAG, es zeigt uns an, ob wir vor oder
  134. ;    zurück gehen müßen.
  135.  
  136. FLAG:
  137.     dc.b    0,0
  138.  
  139. ;************************************************************************
  140.  
  141. ;    Diese Routine bewegt die Schrift "AMIGA", agiert auf MAINCON1
  142.  
  143.  
  144. BewegeCopper2:
  145.     TST.B    FLAG2        ; Müßen wir vor oder zurück? Wenn FLAG NULL
  146.                 ; ist (TST also BEQ ergibt), dann springen wir
  147.                 ; nach Vorne, wenn es hingegen auf $FF ist,
  148.                 ; (TST also nicht BEQ ergibt), dann fahren wir
  149.                 ; mit dem zurückgehen fort (mit den sub)
  150.     beq.w    Vorne2
  151.     cmpi.b    #$00,MainCon1    ; sind wir auf der Standartposition angekommen,
  152.                 ; also ganz hinten?
  153.     beq.s    GehNachVorne2    ; wenn ja, dann müßen wir nach vorne!
  154.     sub.b    #$11,MainCon1    ; wir ziehen 1 vom Scroll der geraden/ungeraden
  155.     rts            ; Bitplanes ab ($ff,$ee,$dd,$cc,$bb,$aa,$99..)
  156.                 ; gehen somit nach LINKS
  157. GehNachVorne2:
  158.     clr.b    FLAG2    ; Durch Nullsetzen des FLAG wird bei TST.B FLAG
  159.     rts        ; das BEQ die Routine nach Vorne springen lassen, und
  160.             ; das Bild wird vorschreiten (nach rechts)
  161.  
  162. Vorne2:
  163.     cmpi.b    #$ff,MainCon1    ; Sind wir beim Maximalscroll nach vorne ($ff)
  164.                 ; angekommen?? ($f gerade und $f ungerade)
  165.     beq.s    GehNachHinten2    ; wenn ja müßen wir zurückgehen
  166.     add.b    #$11,MainCon1    ; zähle 1 zum Bitplanescroll dazu, gerade und
  167.                 ; ungerade ($11,$22,$33,$44 etc..)
  168.     rts            ; GEH NACH RECHTS
  169.  
  170. GehNachHinten2:
  171.     move.b    #$ff,FLAG2    ; Wenn das Label FLAG nicht auf NULL ist,
  172.     rts            ; dann bedeutet das, daß wir nach links
  173.                 ; zurückgehen müßen
  174. Ende2:
  175.     rts
  176.  
  177.  
  178. ;    Dieses Byte ist ein FLAG, es zeigt uns an, ob wir vor oder
  179. ;    zurück gehen müßen.
  180.  
  181. FLAG2:
  182.     dc.b    0,0
  183.  
  184.  
  185.  
  186.     SECTION GRAPHIC,DATA_C
  187.  
  188. COPPERLIST:
  189.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  190.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  191.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  192.     dc.w    $13e,$0000
  193.  
  194.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  195.     dc.w    $90,$2cc1    ; DiwStop
  196.     dc.w    $92,$0038    ; DdfStart
  197.     dc.w    $94,$00d0    ; DdfStop
  198.  
  199.  
  200.     dc.w    $102        ; BplCon1 - DAS REGISTER
  201.     dc.b    $00        ; BplCon1 - DAS NICHT VERWENDETE BYTE!!!
  202. MeinCon1:
  203.     dc.b    $00        ; BplCon1 - DAS VERWENDETE BYTE!!!
  204.  
  205.  
  206.     dc.w    $104,0        ; BplCon2
  207.     dc.w    $108,0        ; Bpl1Mod
  208.     dc.w    $10a,0        ; Bpl2Mod
  209.  
  210.             ; 5432109876543210  ; BPLCON0:
  211.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  212.                     ; 3 Bitplanes Lowres, nicht Lace
  213. BPLPOINTERS:
  214.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane - BPL0PT
  215.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  216.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  217.  
  218.     dc.w    $0180,$000    ; Color0
  219.     dc.w    $0182,$475    ; Color1
  220.     dc.w    $0184,$fff    ; Color2
  221.     dc.w    $0186,$ccc    ; Color3
  222.     dc.w    $0188,$999    ; Color4
  223.     dc.w    $018a,$232    ; Color5
  224.     dc.w    $018c,$777    ; Color6
  225.     dc.w    $018e,$444    ; Color7
  226.  
  227.     dc.w    $7007,$fffe    ; Warten auf das Ende der "COMMODORE"-Schrift
  228.  
  229.     dc.w    $102        ; BplCon1 - DAS REGISTER
  230.     dc.b    $00        ; BplCon1 - DAS NICHT VERWENDETE BYTE!!!
  231. MainCon1:
  232.     dc.b    $ff        ; BplCon1 - DAS VERWENDETE BYTE!!!
  233.  
  234.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  235.  
  236. ;    BILD
  237.  
  238. PIC:
  239.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  240.                     ; Format
  241.  
  242.     end
  243.  
  244. Dieses  Beispiel  haben  wir  erhalten, indem wir die Routine BewegeCopper
  245. kopiert haben und die Namen vertauscht haben, oder vielmehr, ihnen einfach
  246. einen  2er  hinten drangehängt haben. Oft wird diese Methode verwendet, um
  247. Programmstücke nicht neuschreiben zu müßen. Einfach den Trick  Amiga+b+c+i
  248. verwenden  und  los  geht´s.  Was  die Copperlist angeht, habe ich nur ein
  249. weiteres $dff102 hinzugefügt, dessen Name MainCon1  ist,  alles  nach  dem
  250. Wait $7007, also unter dem Commodore-Schriftzug. Es wird also nur das Bild
  251. unterhalb dieser Zeile verändert, also dem "AMIGA". Um  die  zwei  Hälften
  252. "phasenverschoben"  hin- und herlaufen zu lassen, braucht man nur den Loop
  253. statt mit $00 mit $FF, also 15, starten zu lassen,  und  BewegeCopper  und
  254. BewegeCopper2 laufen in die gegengesetzte Richtung.
  255.  
  256.     dc.w    $102        ; BplCon1 - DAS REGISTER
  257.     dc.b    $00        ; BplCon1 - DAS NICHT VERWENDETE BYTE!!!
  258. MeinCon1:
  259.     dc.b    $00        ; BplCon1 - DAS VERWENDETE BYTE!!!
  260.     
  261.     ...
  262.  
  263.     dc.w    $102        ; BplCon1 - DAS REGISTER
  264.     dc.b    $00        ; BplCon1 - DAS NICHT VERWENDETE BYTE!!!
  265. MainCon1:
  266.     dc.b    $ff        ; BplCon1 - DAS VERWENDETE BYTE!!!
  267.  
  268. Tauscht das Byte MainCon1: aus, setzt statt $ff $55 odes was anderes  ein,
  269. dann wird alles vielleicht ein bißchen mehr einleuchten.
  270.  
  271. Mit  der rechten Maustaste blockiert man nur das zweite $102. Probiert das
  272. Wait zu ändern, um andere Scrollmuster zu erzeugen, z.B.:
  273.  
  274.  
  275.     dc.w    $a007,$fffe
  276.  
  277. Teilt die "AMIGA"-Schrift in zwei Teile.
  278.  
  279.  
  280.