home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings2
/
listing6r.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
16KB
|
489 lines
; Listing6r.s ZUSAMMENFASSUNG VON VERSCHIEDENEN LISTINGS AUS
; DIESER LEKTION + MUSIK-ROUTINE
SECTION CIPundCOP,CODE
Anfang:
move.l 4.w,a6 ; Execbase
jsr -$78(a6) ; Disable
lea GfxName(PC),a1 ; Namen der Lib
jsr -$198(a6) ; OpenLibrary
move.l d0,GfxBase ;
move.l d0,a6
move.l $26(a6),OldCop ; speichern die alte COP
; POINTEN AUF UNSERE BITPLANES
MOVE.L #BITPLANETEXT-2,d0 ; Adresse des Ziel-Bitplane in d0
LEA BPLPOINTERS,A1 ; COP - Pointer
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
MOVE.L #BITPLANEMATRIX-2,d0 ; Adresse Ziel-Bitplane in d0,
LEA BPLPOINTERS2,A1 ; COP - Pointer
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
move.l #COPPERLIST,$dff080 ; COP1LC - unsere COP
move.w d0,$dff088 ; COPJMP1 - Starten unsere COP
move.w #0,$dff1fc ; FMODE - Deaktiviert das AGA
move.w #$c00,$dff106 ; BPLCON3 - Deaktiviert das AGA
bsr.w Matrix3 ; Bringt ein Schachmuster auf Bitplane!
bsr.w mt_init ; Initialisiert die Musikroutine
mouse:
cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
bne.s mouse
bsr.w PrintCharakter ; Druckt Buchstaben für Buchstaben den Text
bsr.w MEGAScroll ; Scoll eines 640 Pixel breiten Bildes
; auf einem LowRes-Screen zu 320 Pixel
bsr.w BOING ; Läßt das Text-Bitplane "springen"
bsr.w mt_music ; Spielt eine Musik
Warte:
cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
beq.s Warte
btst #6,$bfe001 ; linke Maustaste gedrückt?
bne.s mouse
bsr.w mt_end
move.l OldCop(PC),$dff080 ; COP1LC - "Zeiger" auf die Orginal-COP
move.w d0,$dff088 ; COPJMP1 - und starten sie
move.l 4.w,a6
jsr -$7e(a6) ; Enable
move.l GfxBase(PC),a1
jsr -$19e(a6) ; Closelibrary
rts
; DATEN
GfxName:
dc.b "graphics.library",0,0
GfxBase:
dc.l 0
OldCop:
dc.l 0
;************************************************************************
;* Druckt einen Charakter pro Frame auf einen Screnn von 640 Pixel *
;************************************************************************
PRINTCharakter:
MOVE.L PointeText(PC),A0 ; Adresse des zu druckenden Textes in a0
MOVEQ #0,D2 ; Lösche d2
MOVE.B (A0)+,D2 ; Nächster Buchstaben in d2
CMP.B #$ff,d2 ; Ende-Text Signal? ($FF)
beq.s EndeTEXT ; Wenn ja, raus, ohne was zu drucken
TST.B d2 ; Ende-Zeile Signal? ($00)
bne.s NichtEndeZeile ; Wenn nicht, nimm keine neue (Text-)Zeile
ADD.L #80*7,PointeBitplane ; NEUE TEXTZEILE
ADDQ.L #1,PointeText ; erster Buchstabe in der neuen Zeile
; (überspringen die NULL)
move.b (a0)+,d2 ; erster Buchstabe in der neuen Zeile
; (überspringen die NULL)
NichtEndeZeile:
SUB.B #$20,D2 ; ZÄHLE 32 VOM ASCII-WERT DES BUCHSTABEN WEG,
; SOMIT VERWANDELN WIR Z.B. DAS LEERZEICHEN
; (Das $20 entspricht), IN $00, DAS
; MALZEICHEN ($21) IN $01...
MULU.W #8,D2 ; MULTIPLIZIERE DIE ERHALTENE ZAHL MIT 8,
; da die Charakter ja 8 Pixel hoch sind
MOVE.L D2,A2
ADD.L #FONT,A2 ; FINDE DEN GEWÜNSCHTEN BUCHSTEBEN IM FONT
MOVE.L PointeBitplane(PC),A3 ; Adresse des Ziel-Bitplane in a3
; DRUCKE DEN BUCHSTABEN ZEILE FÜR ZEILE
MOVE.B (A2)+,(A3) ; Drucke Zeile 1 des Buchstaben
MOVE.B (A2)+,80(A3) ; Drucke Zeile 2 " "
MOVE.B (A2)+,80*2(A3) ; Drucke Zeile 3 " "
MOVE.B (A2)+,80*3(A3) ; Drucke Zeile 4 " "
MOVE.B (A2)+,80*4(A3) ; Drucke Zeile 5 " "
MOVE.B (A2)+,80*5(A3) ; Drucke Zeile 6 " "
MOVE.B (A2)+,80*6(A3) ; Drucke Zeile 7 " "
MOVE.B (A2)+,80*7(A3) ; Drucke Zeile 8 " "
ADDQ.L #1,PointeBitplane ; 8 Bit weiter vor (NÄCHSTER BUCHSTABE)
ADDQ.L #1,PointeText ; nächster zu druckende Buchstabe
EndeTEXT:
RTS
PointeText:
dc.l TEXT
PointeBitplane:
dc.l BITPLANETEXT
TEXT:
dc.b " DIESES DEMO FASST DIE LEKTION "
dc.b "6 ZUSAMMEN, ES ENTHAELT SEI ES ",0
dc.b " "
dc.b " ",0
dc.b " DIE DRUCKROUTINE FUER 8X8 PIXE"
dc.b "L GROSSE CHARAKTER, WIE AUCH ",0
dc.b " "
dc.b " ",0
dc.b " DEN HORIZONTALEN SCROLL MIT DE"
dc.b "M BPLCON1 ($dff102) UND DEN BIT- ",0
dc.b " "
dc.b " ",0
dc.b " PLANEPOINTERS UND DIE VERWENDU"
dc.b "NG EINER VORDEFINIERTEN TABELLE ",0
dc.b " "
dc.b " ",0
dc.b " FUER DEN VERTIKALSCROLL DIESES"
dc.b " TEXTES. ",0
dc.b " "
dc.b " ",0
dc.b " DAS PLAYFIELD, AUF DEM DIESER "
dc.b "TEXT GEDRUCKT WIRD, IST SO GROSS ",0
dc.b " "
dc.b " ",0
dc.b " WIE EIN HIRES-SCHIRM, ALSO 640"
dc.b " PIXEL IN DER BREITE UND 256 IN ",0
dc.b " "
dc.b " ",0
dc.b " DER HOEHE, ES WIRD SOWOHL VERT"
dc.b "IKAL WIE AUCH HORIZONTAL GESCROLLT, ",0
dc.b " "
dc.b " ",0
dc.b " WAEHREND DAS BITPLANE MIT DEM "
dc.b "SCHACHMUSTER NUR HORIZONTAL HIN UND ",0
dc.b " "
dc.b " ",0
dc.b " HER GESCROLLT WIRD. DER VERTIK"
dc.b "ALSCROLL HAT EIN VARIABLES TEMPO, ",0
dc.b " "
dc.b " ",0
dc.b " WEIL ER VON EINER TABELLE BEST"
dc.b "IMMT WIRD, DER HORIZONTALE IST IMMER ",0
dc.b " "
dc.b " ",0
dc.b " ZU 2 PIXEL PRO FOTOGRAMM (FRAM"
dc.b "E). ",$FF
EVEN
;************************************************************************
;* Scroll von 320 Pixel nach Links und Rechts (Listing6o.s) *
;************************************************************************
; Bemerkung: So modifizieren, daß auf das Bitplane MATRIX zugegriffen
; wird!
MEGAScroll:
addq.w #1,WieOft ; Signalisieren einen weiteren Durchgang
cmp.w #160,WieOft ; Sind wir auf 320?
bne.S BewegNochMal ; Wenn nicht, scrolle noch weiter
BCHG.B #1,RechtsLinks ; Wenn wir aber auf 320 sind, wechsle Richtung
CLR.w WieOft ; und setze "WieOft" auf NULL
rts
BewegNochMal:
BTST #1,RechtsLinks ; Müssen wir rechts oder links gehen?
BEQ.S GehLinks
bsr.s Rechts ; Scrollt ein Pixel nach Rechts
bsr.s Rechts ; Scrollt ein Pixel nach Rechts
; 2 Pixel pro Frame, also doppelte Geschwindigkeit
rts
GehLinks:
bsr.s Links ; Scrollt ein Pixel nach Links
bsr.s Links ; Scrollt ein Pixel nach Links
; Auch hier zwei mal, doppelte Geschwindigkeit
rts
; Dieses Word zählt, wie oft wir Links bzw. Rechts gegangen sind.
WieOft:
DC.W 0
; Wenn das Bit 1 von RechtsLinks auf NULL ist, dann scrollt die Routine
; nach links, wenn es auf EINS ist, dann nach rechts
RechtsLinks:
DC.W 0
; Diese Routine scrollt ein Bitplane nach rechts, indem es auf das BPLCON1
; und den Bitplanepointers in der Copperlist einwirkt. MEINBPCON1 ist das
; Byte des BPLCON1.
Rechts:
CMP.B #$ff,MEINBPCON1 ; sind wir bei maximalen Scroll angelangt (15)?
BNE.s CON1ADDA ; wenn nicht, weiter um ein weiteres
LEA BPLPOINTERS,A1 ; Mit diesen 4 Anweisungen holen wir aus der
move.w 2(a1),d0 ; Copperlist die Adresse, wohin das $dff0e0
swap d0 ; gerade pointet und geben diesen Wert
move.w 6(a1),d0 ; in d0
LEA BPLPOINTERS2,A2 ; Take address from copperlist
move.w 2(a2),d1
swap d1
move.w 6(a2),d1
subq.l #2,d0 ; pointet 16 Bit weiter nach hinten, das Bild
; scrollt um 16 Pixel nach Rechts
subq.l #2,d1 ; pointet 16 Bit weiter nach hinten...
clr.b MEINBPCON1 ; löscht den Hardwarescroll des BPLCON1 ($dff102)
; denn wir haben 16 Pixel schon mit den Bitplane-
; Pointers "übersprungen", wir müssen wieder bei
; NULL beginnen, um mit dem $dff102 um jeweils
; 1 Pixel nach rechts zu gehen.
; Pointen auf das Text-Bitplane
move.w d0,6(a1) ; kopiert das niederw. Word der Adress des Plane
swap d0 ; vertauscht die 2 Word von d0 (z.B.: 1234 > 3412)
move.w d0,2(a1) ; kopiert das höherw. Word der Adresse des Plane
; Pointen auf das MATRIX-Bitplane
move.w d1,6(a2) ; kopiert das niederw. Word der Adress des Plane
swap d1 ; vertauscht die 2 Word von d1 (z.B.: 1234 > 3412)
move.w d1,2(a2) ; kopiert das höherw. Word der Adresse des Plane
rts
CON1ADDA:
add.b #$11,MEINBPCON1 ; scrolle ein Pixel nach vorne
rts
; Routine, die nach Links scrollt, identisch mit der vorherigen:
LINKS:
TST.B MEINBPCON1 ; sind wir bei minimalen Scroll angelangt (00)?
BNE.s CON1SUBBA ; wenn nicht, zurück um ein weiteres
LEA BPLPOINTERS,A1 ; Mit diesen 4 Anweisungen holen wir aus der
move.w 2(a1),d0 ; Copperlist die Adresse, wohin das $dff0e0
swap d0 ; gerade pointet und geben diesen Wert
move.w 6(a1),d0 ; in d0
LEA BPLPOINTERS2,A2 ; Mit diesen 4 Anweisungen holen wir aus der
move.w 2(a2),d1 ; Copperlist die Adresse, wohin das $dff0e0
swap d1 ; gerade pointet und geben diesen Wert
move.w 6(a2),d1 ; in d0
addq.l #2,d0 ; pointet 16 Bit weiter nach vorne, das Bild
; scrollt um 16 Pixel nach Links
addq.l #2,d1 ; pointet 16 Bit weiter nach vorne, das Bild
; scrollt um 16 Pixel nach Links
move.b #$FF,MEINBPCON1 ; Hardwarescroll auf 00 (BPLCON1, $dff102)
; Pointen auf das Text-Bitplane
move.w d0,6(a1) ; kopiert das niederw. Word der Adress des Plane
swap d0 ; vertauscht die 2 Word von d0 (z.B.: 1234 > 3412)
move.w d0,2(a1) ; kopiert das höherw. Word der Adresse des Plane
; Pointen auf das MATRIX-Bitplane
move.w d1,6(a2) ; kopiert das niederw. Word der Adress des Plane
swap d1 ; vertauscht die 2 Word von d1 (z.B.: 1234 > 3412)
move.w d1,2(a2) ; kopiert das höherw. Word der Adresse des Plane
rts
CON1SUBBA:
sub.b #$11,MEINBPCON1 ; scrolle ein Pixel nach hinten
rts
;************************************************************************
;* Scrollt RAUF/RUNTER unter Verwendung einer Tabelle (Listing6m.s) *
;************************************************************************
BOING:
LEA BPLPOINTERS,A1 ; Mit diesen 4 Anweisungen holen wir aus der
move.w 2(a1),d0 ; Copperlist die Adresse, wohin das $dff0e0
swap d0 ; gerade pointet und geben diesen Wert
move.w 6(a1),d0 ; in d0
ADDQ.L #4,BOINGTABPOINT ; Pointe auf das nächste Longword
MOVE.L BOINGTABPOINT(PC),A0 ; Adresse, die im Long BOINGTABPOINT steht
; wird in a0 kopiert
CMP.L #ENDEBOINGTAB-4,A0 ; Sind wir beim letzten Longword in der TAB?
BNE.S NOBSTART2 ; noch nicht? dann fahr´ fort
MOVE.L #BOINGTAB-4,BOINGTABPOINT ; Starte wieder beim ersten Long
NOBSTART2:
MOVE.l (A0),d1 ; kopiere das Long aus der Tabelle in d1
sub.l d1,d0 ; subtrahieren den Wert aud der Tabelle, somit
; scrollt das Bild rauf oder runter
LEA BPLPOINTERS,A1 ; Pointer in der COPPERLIST
MOVEQ #1,D1 ; Anzahl der Bitplanes -1 (hier sind es 2)
POINTBP2:
move.w d0,6(a1) ; kopiert das niederw. Word der Adress des Plane
swap d0 ; vertauscht die 2 Word von d0 (z.B.: 1234 > 3412)
move.w d0,2(a1) ; kopiert das höherw. Word der Adresse des Plane
swap d0 ; vertauscht die 2 Word von d0 (3412 > 1234)
ADD.L #80*256,d0 ; + Länge Bitplane -> nächstes Bitplane
addq.w #8,a1 ; zu den nächsten bplpointers in der Cop
; dbra d1,POINTBP2 ; Wiederhole D1 Mal POINTBP (D1=num of bitplanes)
rts
BOINGTABPOINT: ; Dieses Longword "POINTET" auf BOINGTAB, also
dc.l BOINGTAB-4 ; enthält es die Adresse von BOINGTAB. Es wird
; die Adresse des letzten gelesenen Long innerhalb
; der Tab beinhalten.(hier beginnt es bei BOINGTAB-4
; weil BOING mit einem ADDQ.L #4,C.. beginnt
; es gleicht somit diese Anweisung aus.
; Die Tabelle mit den "vorgerechneten" Rückprallwerten:
BOINGTAB:
dc.l 0,0,80,80,80,80,80,80,80,80,80 ; ganz Oben
dc.l 80,80,2*80,2*80
dc.l 2*80,2*80,2*80,2*80,2*80 ; beschleunigen
dc.l 3*80,3*80,3*80,3*80,3*80
dc.l 3*80,3*80,3*80,3*80,3*80
dc.l 2*80,2*80,2*80,2*80,2*80 ; bremsen
dc.l 2*80,2*80,80,80
dc.l 80,80,80,80,80,80,80,80,80,0,0,0,0,0,0,0 ; ganz Unten
dc.l -80,-80,-80,-80,-80,-80,-80,-80,-80
dc.l -80,-80,-2*80,-2*80
dc.l -2*80,-2*80,-2*80,-2*80,-2*80
dc.l -3*80,-3*80,-3*80,-3*80,-3*80 ; beschleunigen
dc.l -3*80,-3*80,-3*80,-3*80,-3*80
dc.l -2*80,-2*80,-2*80,-2*80,-2*80 ; bremsen
dc.l -2*80,-2*80,-80,-80
dc.l -80,-80,-80,-80,-80,-80,-80,-80,-80,0,0,0,0,0 ; ganz Oben
ENDEBOINGTAB:
;************************************************************************
;* Erstllt ein Schachbrett mit 16 Pixel großen Quadraten (Listing6q.s) *
;************************************************************************
MATRIX3:
LEA BITPLANEMATRIX,a0 ; Adresse Ziel-Bitplane
MOVEQ #8-1,d0 ; 8 Paare von 16 Pixel hohen Quadraten
; 8*2*4=256 totales Ausfüllen des Bildschirmes
MachPaar3:
move.l #(20*16)-1,d1 ; 10 Bytes um eine Zeile zu füllen
; 16 Zeilen zu füllen
MachEins3:
move.l #%11111111111111110000000000000000,(a0)+
; Länge eines Quadrates auf 1=16 Pixel
; Quadrate auf NULL = 16 Pixel
dbra d1,MachEins3 ; mach 16 Zeilen #.#.#.#.#.#.#.#.#.#
move.l #(20*16)-1,d1 ; 10 Bytes um eine Zeile zu füllen
; 16 Zeilen zu füllen
MachAndres3:
move.l #%00000000000000001111111111111111,(a0)+
; Länge eine auf NULL gesetzten Quadr.=16 Pixel
; Quadrat auf 1 = 16 Pixel
dbra d1,MachAndres3 ; mach 8 Zeilen .#.#.#.#.#.#.#.#.#.
DBRA d0,MachPaar3 ; mach 8 Paare von Quadraten
; #.#.#.#.#.#.#.#.#.#
rts ; .#.#.#.#.#.#.#.#.#.
; **************************************************************************
; * ROUTINE; DIE DIE MUSIK SPIELT (SOUNDTRACKER/PROTRACKER) *
; **************************************************************************
include "music.s" ; Routine 100% funktionsfähig auf allen Amigas
SECTION GRAPHIC,DATA_C
COPPERLIST:
dc.w $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
dc.w $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
dc.w $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
dc.w $13e,$0000
dc.w $8E,$2c81 ; DiwStrt (Register mit Normalwerten)
dc.w $90,$2cc1 ; DiwStop
dc.w $92,$0030 ; DdfStart (wegen Scroll modifiziert)
dc.w $94,$00d0 ; DdfStop
dc.w $102 ; BplCon1
dc.b 0 ; hochwertiges Byte des $dff102,nicht verwendet
MEINBPCON1:
dc.b 0 ; niederwertiges Byte des $dff102, verwendet
dc.w $104,0 ; BplCon2
dc.w $108,40-2 ; Bpl1Mod ( 40 für ein Bild, das 640 breit ist,
dc.w $10a,40-2 ; Bpl2Mod -2 um das DDFSTART auszugleichen)
; 5432109876543210
dc.w $100,%0010001000000000 ; Bits 13 an -
BPLPOINTERS:
dc.w $e0,$0000,$e2,$0000 ;erstes Bitplane
BPLPOINTERS2:
dc.w $e4,0,$e6,0 ; zweites Bitplane
dc.w $180,$113 ; color0 - DUNKLES QUADRAT
dc.w $182,$bb5 ; color1 - SCHRIFTEN+dunkles Quadrat
dc.w $184,$225 ; color2 - Helles Quadrat
dc.w $186,$bb5 ; color3 - SCHRIFTEN+Helles Quadrat
dc.w $FFFF,$FFFE ; Ende der Copperlist
; Der FONT, Charakter 8x8
FONT:
incbin "metal.fnt" ; Breiter Zeichensatz
; incbin "normal.fnt" ; Ähnlich dem aus dem Kickstart 1.3
; incbin "nice.fnt" ; Schmaler Zeichensatz
; **************************************************************************
; * PROTRACKER-MUSIKSTÜCK *
; **************************************************************************
mt_data:
incbin "mod.purple-shades"
SECTION MEIPLANE,BSS_C
BITPLANEMATRIX:
ds.b 80*256 ; ein Bitplane, 640x256 breit (wie Hires)
ds.b 80*100
BITPLANETEXT:
ds.b 80*256 ; ein Bitplane 640x256
end
Manchmal ergeben einige nicht recht aufsehenerregende Routinen zusammen
einen recht schönes Ergebnis...