Editorial Inhalt Impressum

;Datei       : listing2.asm
;Beschreibung: Unsere erste Copperliste.
;Autor       : Enrico Bauermeister
;Datum       : 07.10.1997
;Assembler   : TFA AsmOne v1.29
;=======================================
 
 
; graphics.library öffnen
;------------------------
 lea      gfxname(pc),a1       ;Name der Library
 moveq    #0,d0                ;Version der Library
 move.l   4.w,a6               ;Basisadresse der exec.library
 jsr      -552(a6)             ;OpenLibrary()
 tst.l    d0                   ;Lib geöffnet ?
 beq      ende                 ;nein -> ende
 lea      _GfxBase(pc),a0      ;Basisadresse der graphics.library
 move.l   d0,(a0)              ;in _GfxBase sichern
 
 
; Interrupts verbieten (Mulitasking abschalten)
;-----------------------------------------------
 jsr      -120(a6)             ;Disable() - Wir schalten hier das
                               ;Multitasking ab. Unser Programm hat
                               ;nun den ganzen Amiga für sich alleine.
 
 
; alte Copperliste speichern
;---------------------------
 move.l   _GfxBase(pc),a6
 move.l   $26(a6),OldCop       ;Auf Adresse $26 zur Basisadresse
                               ;der graphics.library liegt die Adresse
                               ;der aktuellen Copperliste.
 
 
; unsere eigende Copperliste starten
;------------------------------------
 move.l   #Copperliste,$dff080 ;Im Register COP1LC steht nun die Adresse
                               ;unserer Copperliste.
 move.w   d0,$dff088           ;Wir starten unsere Copperliste indem wir
                               ;irgendeinen Wert ins Register COPJMP1
                               ;reinschreiben, z.B. D0.
 
 
; testen ob linke Maustaste gedrückt wurde
;------------------------------------------
waitmouse
 btst    #6,$bfe001            ;btst - test bit -
                               ;Testen ob Bit 6 im Register PRA ($bfe001)
                               ;gesetzt (also 1) ist.
 bne.s   waitmouse             ;Nein -> waitmouse

; alte Copperliste wieder starten
;--------------------------------
 move.l  OldCop(pc),$dff080    ;In Register COP1LC steht nun wieder die
                               ;Adresse der alten Copperliste
 move.w  d0,$dff088            ;In COPJMP1 irgendeinen Wert -> alte
                               ;Copperliste starten
 
 
; Interrupts wieder zulassen (Multitasking einschalten)
;------------------------------------------------------
 move.l  4.w,a6                ;Basisadresse der exec.library
 
 jsr     -126(a6)              ;Enable() - So, nun können wieder mehrere
                               ;Programme den Amigs nutzen.
 
 
; graphics.library wieder schliessen
;------------------------------------
 move.l   _GfxBase(pc),a1      ;Basisadresse der graphics.library
 
 jsr      -414(a6)             ;CloseLibrary()
 
 
; Programm verlassen
;--------------------
ende
 moveq    #0,d0                ;Rückgabewert des Programmes
 rts                           ;und tschüß ...
 
 
; Datenbereich
;--------------
gfxname:  dc.b  'graphics.library',0
          cnop  0,2 _GfxBase: dc.l  0
OldCop:   dc.l  0
 
 
; Unsere eigene Copperliste definieren
;--------------------------------------
 SECTION Grafik,CODE_C         ;SECTION ist eine Assemblerdirektive,
                               ;mit der man sein Programm in mehrere
                               ;Stücke aufteilen kann (dann kann das
                               ;Betriebssystem das Programm leichter
                               ;in den Speicher laden, weil es dann
                               ;jedes Stück in einen anderen Speicher-
                               ;bereich laden kann). "CODE_C" bedeutet,
                               ;daß folgender Programmcode ins ChipRAM
                               ;geladen werden soll (ihr wisst ja, die
                               ;CustomChips können nur aufs ChipRAM
                               ;zugreifen).
Copperliste
  dc.w    $100,$200            ;Im Register BPLCON0 ($dff100) kann man
                               ;festlegen, welche eigenschaften unser
                               ;Screen haben soll. Was der Wert $200
                               ;bedeutet, werde ich an passender Stelle
                               ;schon erklären. Nur soviel sage ich jetzt:
                               ;ihr könnt nur die Farbe 0 (COLOR00 -
                               ;$dff180) nutzen.
 
 
  dc.w    $180,$000            ;COLOR00 auf Schwarz setzen
 
 
  dc.w    $2c07,$fffe          ;Auf Zeile 44 (hex. $2c) warten. Dies ist
                               ;nun unser erster WAIT-Befehl (dieses
                               ;$fffe). Wenn wir wie hier auf vertikale
                               ;Positionen warten wollen, gibt in der
                               ;horizontalen immer $07 an (steht auch so
                               ;im "Hardware Reference Manual"). Wir warten
                               ;hier deshalb auf Zeile 44, weil an dieser
                               ;stelle erst der sichtbare Bereich des
                               ;Screens anfängt, und nicht wie erwartet bei
                               ;0.
 
  dc.w    $180,$0af            ;COLOR00 - helles Blau
 
  dc.w    $3107,$fffe          ;auf Zeile 49 warten
 
  dc.w    $180,$09f            ;COLOR00 - Blau wird dunkler
 
  dc.w    $3607,$fffe          ;auf Zeile 54 warten
 
  dc.w    $180,$08f            ;COLOR00 - Blau wird dunkler
 
  dc.w    $3b07,$fffe          ;auf Zeile 59 warten
 
  dc.w    $180,$07f            ;COLOR00 - Blau wird dunkler
 
  dc.w    $4007,$fffe          ;auf Zeile 64 warten
 
  dc.w    $180,$06f            ;COLOR00 - Blau wird dunkler
 
  dc.w    $4507,$fffe          ;auf Zeile 69 warten
 
  dc.w    $180,$05f            ;COLOR00 - Blau wird dunkler
 
  dc.w    $4a07,$fffe          ;auf Zeile 74 warten
 
  dc.w    $180,$04f            ;COLOR00 - Blau wird dunkler
    dc.w    $4f07,$fffe          ;auf Zeile 79 warten
  dc.w    $180,$03f            ;COLOR00 - Blau wird dunkler
 
  dc.w    $5407,$fffe          ;auf Zeile 84 warten
 
  dc.w    $180,$02f            ;COLOR00 - Blau wird dunkler
 
  dc.w    $5907,$fffe          ;auf Zeile 89 warten
 
  dc.w    $180,$000            ;COLOR00 auf Schwarz setzen
 
  dc.w    $ffdf,$fffe          ;auf Ende der Zeile 255 warten
                               ;Da der sichtbare Bereich ja ab Zeile
                               ;44 beginnt unser Bildschirm aber 256
                               ;Zeilen hoch ist, müssten wir eigentlich
                               ;bis Zeile 300 gehen können um das Bild-
                               ;schirmende erreichen zu können. Aber die
                               ;vertikale Position wird in nur einem Byte
                               ;gespeichert, und den grössten Wert den
                               ;wir in einem Byte speichern können ist
                               ;$ff (255). Um nun auch die letzen 44
                               ;Zeilen erreichen zu können, muß man
                               ;"dc.w $ffdf,$fffe" schreiben. Das heißt,
                               ;wir warten auf Zeile 255 und die folgenden
                               ;Zeilen (also unter 255) fangen wieder bei
                               ;0 an. Zum Beispiel: nach "dc.w $ffdf,$fffe"
                               ;heißt Zeile 10 nicht oben am Bildschirm,
                               ;sondern Zeile 10 unter Zeile 255 (also
                               ;Zeile 265).
 
 
  dc.w    $180,$02f            ;COLOR00 - dunkles Blau
 
  dc.w    $0507,$fffe          ;auf Zeile 5 warten
 
 
  dc.w    $180,$03f            ;COLOR00 - Blau wird heller
 
 
  dc.w    $0a07,$fffe          ;auf Zeile 10 warten
 
 
  dc.w    $180,$04f            ;COLOR00 - Blau wird heller
 
 
  dc.w    $0f07,$fffe          ;auf Zeile 15 warten
 
 
  dc.w    $180,$05f            ;COLOR00 - Blau wird heller
 
 
  dc.w    $1407,$fffe          ;auf Zeile 20 warten
 
 
  dc.w    $180,$06f            ;COLOR00 - Blau wird heller
 
 
  dc.w    $1907,$fffe          ;auf Zeile 25 warten
 
 
  dc.w    $180,$07f            ;COLOR00 - Blau wird heller
 
 
  dc.w    $1e07,$fffe          ;auf Zeile 30 warten
 
 
  dc.w    $180,$08f            ;COLOR00 - Blau wird heller
 
 
  dc.w    $2307,$fffe          ;auf Zeile 35 warten
 
 
  dc.w    $180,$09f            ;COLOR00 - Blau wird heller
 
 
  dc.w    $2807,$fffe          ;auf Zeile 40 warten
 
 
  dc.w    $180,$0Af            ;COLOR00 - Blau wird heller
 
  dc.w    $2D07,$fffe          ;auf Zeile 45 warten
 
 
  dc.w    $180,$000            ;COLOR00 auf Schwarz setzen
 
 
  dc.w    $ffff,$fffe          ;Ende der Copperliste. Dies muß man
                               ;am Ende einer Liste immer schreiben
 end

Zurück zum Programmierkurs