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

  1.  
  2. ; Listing6l.s    BLINKENDE FARBEN, HERGESTELLT MIT EINER TABELLE
  3. ;        VERWENDET WIRD EINE ROUTINE, DIE AM ENDE RÜCKWÄRTS
  4. ;        GEHT
  5.  
  6.  
  7.     SECTION    CIPundCOP,CODE
  8.  
  9. Anfang:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Namen der Lib
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase    ;
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; speichern die alte COP
  17.  
  18.     move.l    #COPPERLIST,$dff080    ; COP1LC - unsere COP
  19.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  20.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  21.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  22.  
  23. mouse:
  24.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  25.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  26.  
  27.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  28.     beq.s    Warte        ; gehe zu Warte
  29.  
  30.     bsr.w    BLINKEN        ; ansonsten gehe zu BLINKE
  31.  
  32. Warte:
  33.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  34.     beq.s    Warte        ; Wenn nicht, geh nicht weiter
  35.  
  36.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  37.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  38.  
  39.     move.l    OldCop(PC),$dff080 ; COP1LC - "Zeiger" auf die Orginal-COP
  40.     move.w    d0,$dff088       ; COPJMP1 - und starten sie
  41.  
  42.     move.l    4.w,a6
  43.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  44.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  45.                 ; (Libraries werden geöffnet UND geschlossen!)
  46.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  47.     rts
  48.  
  49.  
  50. ; DATEN
  51.  
  52. GfxName:
  53.     dc.b    "graphics.library",0,0    
  54.  
  55. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  56.     dc.l    0    ; ab hier werden die Offsets gemacht
  57.  
  58. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  59.     dc.l    0    ; Betriebssystemes
  60.  
  61. ;    Blinkroutine, die eine vorgefertigte Farbverlauf-TABELLE verwendet.
  62. ;    Diese Tabelle ist nicht anderes als eine Reihe von Words mit den
  63. ;    verschiedenen RGB-Werten, die COLOR1 annehmen wird.
  64. ;    Diese Routine nimmt bei jedem Durchgang den nächsten Wert in der 
  65. ;    Tabelle, und wenn sie beim letzten Word der in ihr angekommen ist,
  66. ;    also beim Label ENDECOLORTAB, dann wechselt sie die Richtung mit dem
  67. ;    BCHG.G  #1,DIRFLAG. Nun wird solange "rückwärts" gegangen, bis wir
  68. ;    beim ersten Word angekommen sind, dann wechseln wir erneut DIRFLAG
  69. ;    und wir fahren fort, indem wir wieder "vorwärts" lesen.
  70. ;    Bemerkung: Diese Routine ist dann nützlich, wenn die Werte so gestaltet
  71. ;    sein sollen, daß sie einen Maximalwert erreicht und dann wieder
  72. ;    abfallen. In diesem Fall hätten wir so eine Tabelle schreiben müssen:
  73. ;
  74. ;    dc.w    0,1,2,3,4,5,6,7,8,9,10 ; rauf bis zum Maximum
  75. ;    dc.w    10,9,8,7,6,5,4,3,2,1,0 ; und dann wieder runter
  76. ;
  77. ;    Bei unserer Routine ist das aber nicht notwendig, es reicht die halbe
  78. ;    Tabelle, bis 10, dann ist die Routine selbst damit beschäftigt, den
  79. ;    "Abstieg" zu machen. Wir sparen Platz und Zeit, wenn die Werte alle
  80. ;    "von Hand" eingegeben werden müssen.
  81. ;    Wenn die Tabelle aber nicht spiegelbildlich wäre, etwa so:
  82. ;
  83. ;    dc.b    0,2,3,5,6,7,8,9,10
  84. ;    dc.b    9,8,7,6,4,3,2,1,0
  85. ;
  86. ;    dann hätten wir eine Routine verwendet, die bis zum Ende liest und
  87. ;    dann von vorne beginnt.
  88.  
  89.  
  90. BLINKEN:
  91.     BTST    #1,DIRFLAG    ; müssen wir die Word in der Tabelle vorwärts
  92.     BEQ.S    RUNTERT2    ; oder rückwärts lesen?
  93. RAUFT2:
  94.     SUBQ.L    #2,COLTABPOINT        ; Pointe auf das vorherige Word
  95.     MOVE.L    COLTABPOINT(PC),A0    ; Adresse, die in COLTABPOINT steht,
  96.                     ; kommt in a0
  97.     CMP.L    #COLORTAB,A0    ; Sind wir beim ersten Wert in der Tabelle 
  98.                 ; angekommen?
  99.     BNE.S    NOBSTART2
  100.     BCHG.B    #1,DIRFLAG        ; ändere Richtung, geh nach vorne!
  101.  
  102. NOBSTART2:
  103.     MOVE.W    (A0),Farbe0    ; kopiere das Word der Tabelle in die COP
  104.     rts
  105.  
  106. RUNTERT2:
  107.     ADDQ.L    #2,COLTABPOINT        ; Pointe auf das nächste Word
  108.     MOVE.L    COLTABPOINT(PC),A0    ; Adresse aus COLTABPOINT kommt in a0
  109.     CMP.L    #ENDECOLORTAB-2,A0    ; Sind wir beim letzten Word der TAB?
  110.     BNE.S    KEINRICHTUNGSWECHSEL    ; wenn nicht, ändere nix
  111.     BCHG.B    #1,DIRFLAG        ; wechsle Richtung, geh rückwärts!
  112. KEINRICHTUNGSWECHSEL:
  113.     MOVE.W    (A0),Farbe0    ; kopiere das Word aus der Tabelle in die
  114.     rts            ; Farbe0 in der COP
  115.  
  116. DIRFLAG:            ; Label FLAG, wird verwendet, um die
  117.     DC.W    0        ; Leserichtung anzugeben.
  118.  
  119.  
  120. COLTABPOINT:           ; Dieses Longword "POINTET" auf COLORTAB, also
  121.     dc.l    COLORTAB-2 ; enthält es die Adresse von COLORTAB. Es wird
  122.                ; die Adresse des zuletzt gelesenen Word innerhalb
  123.                ; der Tabelle beinhalten. (hier beginne es bei 
  124.                ; COLORTAB-2, weil das Blinken ja mit ADDQ.L #2,C...
  125.                ; beginnt. Es dient zum "ausgleich" dieser ersten
  126.                ; Anweisung.
  127.  
  128. ;    Die Tabelle mit den vordefinierten Werten, die das Blinken ergeben:
  129.  
  130. COLORTAB:
  131.     dc.w    $000,$000,$001,$011,$011,$011,$012,$012 ; Beginn DUNKEL
  132.     dc.w    $022,$022,$022,$023,$023
  133.     dc.w    $033,$033,$034
  134.     dc.w    $044,$044
  135.     dc.w    $045,$055,$055
  136.     dc.w    $056,$056,$066,$066,$066
  137.     dc.w    $167,$167,$177,$177,$177,$177,$177
  138.     dc.w    $278,$278,$278,$288,$288,$288,$288,$288
  139.     dc.w    $389,$389,$399,$399,$399,$399
  140.     dc.w    $39a,$39a,$3aa,$3aa,$3aa
  141.     dc.w    $3ab,$3bb,$3bb,$3bb
  142.     dc.w    $4bc,$4cc,$4cc,$4cc
  143.     dc.w    $4cd,$4cd,$4dd,$4dd,$4dd
  144.     dc.w    $5de,$5de,$5ee,$5ee,$5ee,$5ee
  145.     dc.w    $6ef,$6ff,$6ff,$7ff,$7ff,$8ff,$8ff,$9ff ; Maximum HELL
  146. ENDECOLORTAB:
  147.  
  148.  
  149.  
  150.     SECTION GRAPHIC,DATA_C
  151.  
  152. COPPERLIST:
  153.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  154.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  155.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  156.     dc.w    $13e,$0000
  157.  
  158.     dc.w    $8E,$2c81    ; DiwStrt (Register mit Normalwerten)
  159.     dc.w    $90,$2cc1    ; DiwStop
  160.     dc.w    $92,$0038    ; DdfStart
  161.     dc.w    $94,$00d0    ; DdfStop
  162.     dc.w    $102,0        ; BplCon1
  163.     dc.w    $104,0        ; BplCon2
  164.     dc.w    $108,0        ; Bpl1Mod
  165.     dc.w    $10a,0        ; Bpl2Mod
  166.  
  167.             ; 5432109876543210
  168.     dc.w    $100,%0000001000000000  ; 0 BITPLANES LOWRES
  169.  
  170.     dc.w    $0180,$000    ; Color0 - HINTERGRUND
  171.  
  172.     dc.w    $a007,$fffe    ; Wait Zeile $a0
  173.     dc.w    $180
  174. FARBE0:
  175.     dc.w    $000        ; FARBE0
  176.  
  177.     dc.w    $c007,$fffe    ;Wait Zeile $c0
  178.     dc.w    $180,$000    ; Color0
  179.  
  180.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  181.  
  182.     end
  183.  
  184. Dies  ist  eine  der  vielen  Varienten der Routine, die aus einer Tabelle
  185. Werte ausliest. Diese Routine kann nur bei  "spielgelbildlichen"  Tabellen
  186. verwendet werden, also mit gleich ansteigenden Werten, die einen Höhepunkt
  187. erreichen,  und  dann  symetrisch  abfallen  sollen.  Der  Effekt  ist
  188. symetrischer als der in Listing6i.s präsentierte.
  189.  
  190. Versucht, die Tabelle mit dieser zu ersetzen: (Amiga+b+c+i)
  191.  
  192. COLORTAB:
  193.     dc.w $000,$100,$200,$300,$400,$500,$600,$700
  194.     dc.w $800,$900,$a00,$b00,$c00,$d00,$e00
  195.     dc.w $f00,$f10,$f20,$f30,$f40,$f50,$f60,$f70
  196.     dc.w $f80,$f90,$fa0,$fb0,$fc0,$fd0,$fe0
  197.     dc.w $ff0,$ef0,$df0,$cf0,$bf0,$af0,$9f0,$8f0
  198.     dc.w $7f0,$6f0,$5f0,$4f0,$3f0,$2f0,$1f0
  199.     dc.w $0f0,$0f1,$0f2,$0f3,$0f4,$0f5,$0f6,$0f7
  200.     dc.w $0f8,$0f9,$0fa,$0fb,$0fc,$0fd,$0fe
  201.     dc.w $0ff,$0ef,$0df,$0cf,$0bf,$0af,$09f,$08f
  202.     dc.w $07f,$06f,$05f,$04f,$03f,$02f,$01f
  203.     dc.w $00f,$10f,$20f,$30f,$40f,$50f,$60f,$70f
  204.     dc.w $80f,$90f,$a0f,$b0f,$c0f,$d0f,$e0f
  205.     dc.w $f0f,$e0e,$d0d,$c0c,$b0b,$a0a,$909,$808
  206.     dc.w $707,$606,$505,$404,$303,$202,$101,$000
  207. ENDECOLORTAB:
  208.  
  209. Probiert auch diese:
  210.  
  211. COLORTAB:
  212.     dc.w 0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  213.     dc.w $10f,$20f,$30f,$40f,$50f,$60f,$70f,$80f
  214.     dc.w $90f,$a0f,$b0f,$c0f,$d0f,$e0f,$f0f
  215.     dc.w $f1e,$f2d,$f3c,$f4b,$f5a,$f69,$f78,$f87
  216.     dc.w $f96,$fa5,$fb4,$fc3,$fd2,$fe1,$ff0
  217.     dc.w $ff0,$ff0,$fe0,$fd0,$fc0,$fb0,$fa0,$f90
  218.     dc.w $f80,$f70,$f60,$f50,$f40,$f30,$f20,$f10
  219.     dc.w $f00,$f00,$e01,$d02,$c03,$b04,$a05,$906
  220.     dc.w $807,$708,$609,$50a,$40b,$30c,$20d,$10e,15
  221.     dc.w $0f,$1f,$2f,$3f,$4f,$5f,$6f,$7f,$8f,$9f,$af
  222.     dc.w $bf,$cf,$df,$ef,$ff,$ff,$fe,$fd,$fc,$fb,$fa
  223.     dc.w $f9,$f8,$f7,$f6,$f5,$f4,$f3,$f2,$f1,$f0
  224.     dc.w $1f1,$2f2,$3f3,$4f4,$5f5,$6f6,$7f7,$8f8,$9f9
  225.     dc.w $afa,$bfb,$cfc,$dfd,$efe,$fff,$ffe,$ffd,$ffc,$ffb
  226.     dc.w $ffa,$ff9,$ff8,$ff7,$ff6,$ff5,$ff4,$ff3,$ff2,$ff1,$ff0
  227.     dc.w $fe0,$fd0,$fc0,$fb0,$fa0,$f90,$f80,$f70,$f60,$f50,$f40
  228.     dc.w $f30,$f20,$f10,$f00,$f00,$e00,$d00,$c00,$b00,$a00,$900
  229.     dc.w $800,$700,$600,$500,$400,$300,$200,$100,$0,0
  230. ENDECOLORTAB:
  231.  
  232.  
  233.