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

  1.  
  2. ; Listing5e.s    HALBIERUNG EINES BILDES DURCH MODIFIZIERUNG DER MODULO-REGISTER
  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. Frame:
  46.     cmpi.b    #$fe,$dff006    ; sind wie auf Z. 254? (muß Runde wiederholen)
  47.     bne.s    Frame        ; wenn nicht, geh nicht weiter
  48. Frame2:
  49.     cmpi.b    #$fd,$dff006    ; sind wie auf Zeile 253?
  50.     bne.s    Frame2        ; wenn nicht, geh nicht weiter
  51. Frame3:
  52.     cmpi.b    #$fc,$dff006    ; sind wie auf Zeile  252?
  53.     bne.s    Frame3
  54. Frame4:
  55.     cmpi.b    #$fb,$dff006    ; sind wie auf Zeile  251?
  56.     bne.s    Frame4
  57.     
  58.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  59.     beq.s    NichtBewegen    ; überspringe die Routine
  60.  
  61.     bsr.s    BewegeCopper    ; Effekt
  62.  
  63. NichtBewegen:
  64.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  65.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  66.  
  67.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  68.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  69.  
  70.     move.l    4.w,a6
  71.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  72.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  73.                 ; (Libraries werden geöffnet UND geschlossen!)
  74.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  75.     rts
  76.  
  77. ; DATEN
  78.  
  79. GfxName:
  80.     dc.b    "graphics.library",0,0    
  81.  
  82. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  83.     dc.l    0    ; ab hier werden die Offsets gemacht
  84.  
  85. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  86.     dc.l    0    ; Betriebssystemes
  87.  
  88.  
  89. ; Mit dieser Routine addiere oder subtrahiere ich 40 zu den Modulo-Registern,
  90. ; was eine halbierund der Pic zur Folge hat. Ich habe die Labelnamen gleich
  91. ; gelassen, um Zeit zu sparen.
  92.  
  93. BewegeCopper:
  94.     TST.B    RaufRunter    ; Müßen wir rauf oder runter?
  95.     beq.w    GehRunter
  96.     tst.w    MOD1        ; Sind wir auf Normalwert des Modulo? (NULL)
  97.     beq.s    SetzRunter    ; wenn ja, Wert erhöhen
  98.     sub.w    #40,MOD1       ; subtrahieren 40, also 1 Zeile, somit "scrollt"
  99.                    ; das Bild nach UNTEN und vergrößert sich zoom
  100.     sub.w    #40,MOD2       ; zählen 40 von Modulo2 weg
  101.     rts
  102.  
  103. SetzRunter:
  104.     clr.b    RaufRunter    ; Durch Löschen von RaufRunter wird das TST
  105.     rts
  106.  
  107. GehRunter:
  108.     cmpi.w    #40*20,MOD1 ; haben wir genug halbiert??
  109.     beq.s    SetzRauf    ; wenn ja, müßen wir das Pic wieder in
  110.                 ; Normalzustand bringen
  111.     add.w    #40,MOD1    ; Addieren 40, also 1 Zeile, somit "scrollt" das
  112.                 ; Bild nach OBEN, womit es halbiert wird
  113.     add.w    #40,MOD2    ; Addieren 40 zum Modulo2
  114.     rts
  115.  
  116. SetzRauf:
  117.     move.b    #$ff,RaufRunter ; Wenn das Label nicht auf NULL steht,
  118.     rts            ; bedeutet das, daß wir rauf müßen
  119.  
  120. ;    Dieses Byte, vom Label RaufRunter markiert, ist ein FLAG.
  121.  
  122. RaufRunter:
  123.     dc.b    0,0
  124.  
  125.  
  126.     SECTION GRAPHIC,DATA_C
  127.  
  128.  
  129. COPPERLIST:
  130.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  131.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  132.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  133.     dc.w    $13e,$0000
  134.  
  135.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  136.     dc.w    $90,$2cc1    ; DiwStop
  137.     dc.w    $92,$0038    ; DdfStart
  138.     dc.w    $94,$00d0    ; DdfStop
  139.     dc.w    $102,0        ; BplCon1
  140.     dc.w    $104,0        ; BplCon2
  141.     dc.w    $108        ; Bpl1Mod
  142.  
  143. MOD1:
  144.     dc.w    0        ; Bpl1Mod
  145.     dc.w    $10a
  146. MOD2:
  147.     DC.W    0        ; Bpl2Mod
  148.  
  149.             ; 5432109876543210  ; BPLCON0:
  150.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  151.                     ; 3 Bitplanes Lowres, nicht Lace
  152. BPLPOINTERS:
  153.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane - BPL0PT
  154.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  155.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  156.  
  157.     dc.w    $0180,$000    ; Color0
  158.     dc.w    $0182,$475    ; Color1
  159.     dc.w    $0184,$fff    ; Color2
  160.     dc.w    $0186,$ccc    ; Color3
  161.     dc.w    $0188,$999    ; Color4
  162.     dc.w    $018a,$232    ; Color5
  163.     dc.w    $018c,$777    ; Color6
  164.     dc.w    $018e,$444    ; Color7
  165.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  166.  
  167. ;    BILD
  168.  
  169.     dcb.b    30*40,0    ; Wegen der Bytes über und unter der Pic 
  170. PIC:
  171.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  172.  
  173.     dcb.b    30*40,0    ; Wegen der Bytes über und unter der Pic Format
  174.  
  175.     end
  176.  
  177. Wenn ich ganz "sauber" arbeiten gewollt hätte, dann  hätte  ich  ein  Wait
  178. unters  Bild  geben  müßen,  um  die  überflüßigen Bytes, die nach dem Pic
  179. stehen, zu eliminieren. Aber die Hauptsache ist ja, euch  zuerklären,  wie
  180. die  Sache  mit den Modulo geht. Die Routine wird einmal alle 4 Fotogramme
  181. (Frames) ausgeführt, um sie etwas langsamer zu gestalten.
  182.  
  183.