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

  1.  
  2. ; Listing5f.s    "SCHMELZEFFEKT" ODER "FLOOD", HERGESTELLT MIT NEGATIVEN MODULO 
  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    Flood        ; Effekt des "Schmelzens"
  49.  
  50. Warte:
  51.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  52.     beq.s    Warte        ; Wenn nicht, geh nicht weiter
  53.  
  54.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  55.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  56.  
  57.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  58.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  59.  
  60.     move.l    4.w,a6
  61.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  62.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  63.                 ; (Libraries werden geöffnet UND geschlossen!)
  64.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  65.     rts
  66.  
  67.  
  68. ; DATEN
  69.  
  70. GfxName:
  71.     dc.b    "graphics.library",0,0    
  72.  
  73. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  74.     dc.l    0    ; ab hier werden die Offsets gemacht
  75.  
  76. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  77.     dc.l    0    ; Betriebssystemes
  78.  
  79.  
  80. ; Effekt, den man als "flüßiges Metall" definieren könnte.
  81. ; Erreicht mit Modulo -40
  82.  
  83. Flood:
  84.     TST.B    RaufRunter    ; Müßen wir rauf oder runter?
  85.     beq.w    GehRunter
  86.     cmp.b    #$30,FWAIT    ; sind wir weit genug oben?
  87.     beq.s    SetzRunter    ; wenn ja, sind wir oben und müßen runter
  88.     subq.b    #1,FWAIT
  89.     rts
  90.  
  91. SetzRunter:
  92.     clr.b    RaufRunter    ; Durch Löschen von RaufRunter wird das TST
  93.     rts
  94.  
  95. GehRunter:
  96.     cmp.b    #$f0,FWAIT    ; sind wir weit genug Unten?
  97.     beq.s    SetzRauf    ; wenn ja, müßen wir rauf gehen
  98.     addq.b    #1,FWAIT    ; gehen nach oben
  99.     rts
  100.  
  101. SetzRauf:
  102.     move.b    #$ff,RaufRunter ; Wenn das Label nicht auf NULL steht,
  103.     rts            ; bedeutet das, daß wir rauf müßen
  104.  
  105.  
  106. ;    Dieses Byte, vom Label RaufRunter markiert, ist ein FLAG.
  107.  
  108. RaufRunter:
  109.     dc.b    0,0
  110.  
  111.  
  112.     SECTION GRAPHIC,DATA_C
  113.  
  114.  
  115. COPPERLIST:
  116.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  117.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  118.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  119.     dc.w    $13e,$0000
  120.  
  121.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  122.     dc.w    $90,$2cc1    ; DiwStop
  123.     dc.w    $92,$0038    ; DdfStart
  124.     dc.w    $94,$00d0    ; DdfStop
  125.     dc.w    $102,0        ; BplCon1
  126.     dc.w    $104,0        ; BplCon2
  127.     dc.w    $108,0        ; Bpl1Mod
  128.     dc.w    $10a,0        ; Bpl2Mod
  129.  
  130.             ; 5432109876543210  ; BPLCON0:
  131.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  132.                     ; 3 Bitplanes Lowres, nicht Lace
  133. BPLPOINTERS:
  134.     dc.w $e0,$0000,$e2,$0000    ; erstes  Bitplane - BPL0PT
  135.     dc.w $e4,$0000,$e6,$0000    ; zweites Bitplane - BPL1PT
  136.     dc.w $e8,$0000,$ea,$0000    ; drittes Bitplane - BPL2PT
  137.  
  138.     dc.w    $0180,$000    ; Color0
  139.     dc.w    $0182,$475    ; Color1
  140.     dc.w    $0184,$fff    ; Color2
  141.     dc.w    $0186,$ccc    ; Color3
  142.     dc.w    $0188,$999    ; Color4
  143.     dc.w    $018a,$232    ; Color5
  144.     dc.w    $018c,$777    ; Color6
  145.     dc.w    $018e,$444    ; Color7
  146. FWAIT:
  147.     dc.w    $3007,$FFFE    ; WAIT das dem negativen Modulo
  148.     dc.w    $108,-40    ; vorangeht
  149.     dc.w    $10a,-40
  150.      
  151.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  152.  
  153. ;    BILD
  154.  
  155. PIC:    
  156.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  157.                     ; Format
  158.  
  159.     end
  160.  
  161. Zu Bemerken ist, daß -40 als $ffd9 assembliert wird (probiert ein "?-40").
  162. Versucht, die Routine zu stoppen, indem ihr die rechte  Maustaste  drückt,
  163. ihr  werdet sehen, wie sich die letzte Zeile bis zum Ende des Bildschirmes
  164. fortsetzt. Wir haben festgestellt, daß mit einem Modulo von -40 der Copper
  165. praktisch  nicht  voran kommt, er geht zwar 40 vor, kehrt dann aber wieder
  166. 40 zurück. Aber wenn wir das Modulo -80 setzen, was  passiert  dann??  Wie
  167. lesen  rückwärts!!  In  der  Tat, er liest 40 Bytes, geht 80 zurück, liest
  168. weitere 40, geht  80  zurück  etc.  Er  hüpft  also  jedesmal  eine  Zeile
  169. rückwärts. Dieser "Spiegeleffekt" ist auf dem Amiga recht häufig zu sehen,
  170. eben  weil  er  sehr  einfach  zu  erzeugen  ist.  Es  reichen  ein   paar
  171. Copperbefehle:
  172.  
  173.     dc.w    $108,-80
  174.     dc.w    $10a,-80
  175.  
  176. Probiert  die  zwei Modulo von -40 auf -80 abzuändern, und der Spiegel wir
  177. erscheinen. Auch wenn diesmal das Problem  ist,  daß  einiges  dargestellt
  178. wird,  das  sich  ober  dem  Bild befindet, wir gehen ja nach hinten. Eine
  179. Kuriosität: ihr seht sicher die erste Zeile des "Schmutzes", die nach  dem
  180. Bild  beginnt.  Gut,  seht ihr auch, daß sich einige Pixel bewegen? Es ist
  181. auf das Wait in der Copperlist zurückzuführen, das sich  bei  jedem  Frame
  182. ändert!  Denn  was  befindet  sich  im  Speicher  vor  unserem  Bild?? Die
  183. Copperlist!! Wenn wir also rückwärts gehen und unser Bild am vorderen Ende
  184. verlassen  (mit  dem Modulo -80), was wird dann wohl angezeigt? zuerst die
  185. Bytes in der Copperlist, und dann was vorher ist..
  186.  
  187. Wenn wir den Negativwert weiter erhöhen, werden wir  immer  "zerdrücktere"
  188. Spiegel  bekommen. Es ist ja das gleiche wie mit den positiven Modulo, nur
  189. seitenverkehrt.
  190.  
  191.     dc.w    $108,-40*3
  192.     dc.w    $10a,-40*3
  193.  
  194. Für ein speigelverkehrtes, halbiertes Bild, etc.
  195.  
  196.  
  197.