home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings2
/
listing6g.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
9KB
|
283 lines
; Listing6g.s SCHREIBEN "ÜBER" EINEM BILD (IN TRANSPARENZ)
; Linke Maustaste um vorzugehen, rechte um
; zurückzugehen, beide, um auszusteigen - man kann
; auch den ganzen Speicher durchsuchen wie in Listing5l.s
SECTION CIPundCOP,CODE
Anfang:
move.l 4.w,a6 ; Execbase in a6
jsr -$78(a6) ; Disable - stoppt das Multitasking
lea GfxName(PC),a1 ; Adresse des Namen der zu öffnenden Lib in a1
jsr -$198(a6) ; OpenLibrary
move.l d0,GfxBase ; speichere diese Adresse in GfxBase
move.l d0,a6
move.l $26(a6),OldCop ; hier speichern wir die Adresse der Copperlist
; des Betriebssystemes
; POINTEN AUF UNSERE BITPLANES
MOVE.L #PIC,d0 ; in d0 kommt die Adresse von unserer PIC
; bzw. wo ihr erstes Bitplane beginnt
LEA BPLPOINTERS,A1 ; in a1 kommt die Adresse der Bitplane-
; Pointer der Copperlist
MOVEQ #2,D1 ; Anzahl der Bitplanes -1 (hier sind es 3)
; für den DBRA - Zyklus
POINTBP:
move.w d0,6(a1) ; kopiert das niederw. Word der Planeadresse
swap d0 ; vertauscht die 2 Word in d0 (1234 > 3412)
move.w d0,2(a1) ; kopiert das hochw. Word der Adresse des Plnae
swap d0 ; vertauscht erneut die 2 Word von d0
ADD.L #40*256,d0 ; + Länge Bitplane -> nächstes Bitplane
addq.w #8,a1 ; auf zum nächsten bplpointer in der COP
dbra d1,POINTBP ; wiederhole D1 mal POINTBP (D1=n. bitplanes)
; POINTEN AUF UNSER BITPLANE
MOVE.L #BITPLANE,d0 ; in d0 kommt die Adresse des PIC
LEA BPLPOINTERS2,A1 ; Pointer in der Copperlist
move.w d0,6(a1) ; kopiert das niederw. Word der Planeadresse
swap d0 ; vertauscht die 2 word in d0 (1234 > 3412)
move.w d0,2(a1) ; kopiert das hochw. Word der Planeadresse
move.l #COPPERLIST,$dff080 ; COP1LC - "Zeiger" auf 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 print ; Bringt den Text auf den Bildschirm
mouse:
cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
bne.s mouse ; Wenn nicht, geh nicht weiter
Warte:
cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
beq.s Warte ; Wenn nicht, geh nicht weiter
btst #2,$dff016 ; wenn die rechte Maustaste gedrückt ist,
bne.s NichtRunter ; gehe zu NichtRunter
bsr.w GehRunter ; ansonsten auf GehRunter
NichtRunter:
btst #6,$bfe001 ; linke Taste gedrückt?
beq.s ScrollRauf ; wenn ja, scrolle rauf
bra.s mouse ; nein? Dann wiederhole den Zyklus noch ein
; FRAME lang
ScrollRauf:
bsr.w GehRauf ; läßt das Bild nach oben scrollen
btst #2,$dff016 ; Right mouse button pressed?
bne.s mouse
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 - stellt Multitasking wieder her
move.l GfxBase(PC),a1 ; Basis der Library, die es zu schließen gilt
; (Libraries werden geöffnet UND geschlossen!)
jsr -$19e(a6) ; Closelibrary - schließt die Graphics lib
rts
; DATEN
GfxName:
dc.b "graphics.library",0,0
GfxBase: ; Hier hinein kommt die Basisadresse der graphics.lib,
dc.l 0 ; ab hier werden die Offsets gemacht
OldCop: ; Hier hinein kommt die Adresse der Orginal-Copperlist des
dc.l 0 ; Betriebssystemes
; Routine, die 8x8 Pixel große Buchstaben druckt
PRINT:
LEA TEXT(PC),A0 ; Adresse des zu schreibenden Textes in a0
LEA BITPLANE,A3 ; Adresse des Ziel-Bitplanes in a3
MOVEQ #26-1,D3 ; ANZAHL DER ZEILEN, DIE ZU DRUCKEN SIND -> 25
PRINTZEILE:
MOVEQ #40-1,D0 ; ANZAHL DER SPALTEN EINER ZEILE: 40 (LOWRES!)
PRINTCHAR2:
MOVEQ #0,D2 ; Löscht D2
MOVE.B (A0)+,D2 ; Nächster Charakter in d2
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
; DRUCKE DEN BUCHSTABEN ZEILE FÜR ZEILE
MOVE.B (A2)+,(A3) ; Drucke Zeile 1 des Buchstaben
MOVE.B (A2)+,40(A3) ; Drucke Zeile 2 " "
MOVE.B (A2)+,40*2(A3) ; Drucke Zeile 3 " "
MOVE.B (A2)+,40*3(A3) ; Drucke Zeile 4 " "
MOVE.B (A2)+,40*4(A3) ; Drucke Zeile 5 " "
MOVE.B (A2)+,40*5(A3) ; Drucke Zeile 6 " "
MOVE.B (A2)+,40*6(A3) ; Drucke Zeile 7 " "
MOVE.B (A2)+,40*7(A3) ; Drucke Zeile 8 " "
ADDQ.w #1,A3 ; A3+1, wir gehen um 8 Bit weiter (zum
; nächsten Buchstaben
DBRA D0,PRINTCHAR2 ; DRUCKEN D0 (80) ZEICHEN PRO ZEILE
ADD.W #40*7,A3 ; "Return", neue Zeile
DBRA D3,PRINTZEILE ; Wir drucken D3 Zeilen
RTS
TEXT:
; Anzahl Charakter pro Zeile: 80, also 2 von diesen zu 40!
; 1111111111222222222233333333334
; 1234567890123456789012345678901234567890
dc.b ' ' ; 1
dc.b ' ZWEITE ZEILE ' ; 2
dc.b ' /\ / ' ; 3
dc.b ' / \/ ' ; 4
dc.b ' ' ; 5
dc.b ' SECHSTE ZEILE ' ; 6
dc.b ' ' ; 7
dc.b ' ' ; 8
dc.b 'FABIO CIUCCI COMMUNICATION INTERNATIONAL' ; 9
dc.b ' ' ; 10
dc.b ' 1234567890 !@#$%^&*()_+|\=-[]{} ' ; 11
dc.b ' ' ; 12
dc.b ' -=- ICH DENKE, ALSO BIN ICH... -=- ' ; 13
dc.b ' ## sagte mal jemand, aber er gefiel ## ' ; 14
dc.b ' ///dem Cartoonzeichner nicht und \\\ ' ; 15
dc.b ' so wurde er ausradiert... ' ; 16
dc.b ' ' ; 17
dc.b ' Das Fraeulein stand am Meere ' ; 18
dc.b ' ' ; 19
dc.b ' und seufzte lang und bang, ' ; 20
dc.b ' ' ; 21
dc.b ' ES RUEHRTE SIE SO SEHRE, ' ; 22
dc.b ' ' ; 23
dc.b ' der Sonnenuntergang. ' ; 24
dc.b ' ' ; 25
dc.b ' ... ' ; 26
EVEN
; Diese Routine bewegt das Bild nach oben und unten, indem es auf die
; Bitplane-Pointers in der Copperlist (mittels dem Label BPLPOINTERS2)
; zugreift. Aus Listing5l.s.
GehRunter:
LEA BPLPOINTERS2,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
sub.l #40,d0 ; subtrahieren 80*3, also 3 Zeilen, somit
; scrollt das Bild nach unten
bra.s ENDE
GehRauf:
LEA BPLPOINTERS2,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
add.l #40,d0 ; addieren 80*3, also 3 Zeilen, somit
; scrollt das Bild nach oben
ENDE: ; WIR POINTEN AUF UNSERE BITPLANES
move.w d0,6(a1) ; kopiert das niederw. Word der Adresse des Plane
swap d0 ; vertauscht die 2 Word in d0 (Z.B.: 1234 > 3412)
move.w d0,2(a1) ; kopiert ds hochw. Word der Adresse des Plane
rts
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,$0038 ; DdfStart
dc.w $94,$00d0 ; DdfStop
dc.w $102,0 ; BplCon1
dc.w $104,0 ; BplCon2
dc.w $108,0 ; Bpl1Mod
dc.w $10a,0 ; Bpl2Mod
; 5432109876543210
dc.w $100,%0100001000000000 ; Bit 14 - 4 Bitplanes, 16 Farben HIRES
BPLPOINTERS:
dc.w $e0,$0000,$e2,$0000 ;erstes Bitplane
dc.w $e4,$0000,$e6,$0000 ;zweites Bitplane
dc.w $e8,$0000,$ea,$0000 ;drittes Bitplane
BPLPOINTERS2:
dc.w $ec,$0000,$ee,$0000 ;viertes Bitplane
dc.w $180,$000 ; Color0 ; Farben des Bildes, ein bißchen
dc.w $182,$354 ; Color1 ; gedämpft
dc.w $184,$678 ; Color2
dc.w $186,$567 ; Color3
dc.w $188,$455 ; Color4
dc.w $18a,$121 ; Color5
dc.w $18c,$455 ; Color6
dc.w $18e,$233 ; Color7
dc.w $190,$454 ; color8 ; Colors of text:
dc.w $192,$7a8 ; color9 ;
dc.w $194,$eef ; color10 ; 8 colors for 8 types of
dc.w $196,$cde ; color11 ; transparency.
dc.w $198,$aab ; color12
dc.w $19a,$786 ; color13
dc.w $19c,$9aa ; color14
dc.w $19e,$789 ; color15
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
PIC:
incbin "amiga.320*256*3" ; hier laden wir das Bild in RAW
SECTION MEIPLANE,BSS_C ; Die SECTION BSS können nur aus NULLEN
; bestehen!!! Man verwendet das DS.B um zu
; definieren, wieviele Nullen die Section
; enthalten soll
BITPLANE:
ds.b 40*256 ; ein Bitplane LOWRES 320x256
end
Ihr könnt auch den ganzen Speicher über dem Bild laufen lassen! Wenn ihr
mit dem rechten Mausknopf nach hinten geht, werdet ihr auch auf die drei
Bitplanes des Bildes stoßen, dann die Charakter des Font (nicht recht gut
sichtbar wegen des nicht übereinstimmenden Modulo).