home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings2
/
listing6h.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
10KB
|
276 lines
; Listing6h.s DRUCKEN MEHRERE ZELEN AUF, IN * 3 * FARBEN,
; DAZU VERWENDEN WIR DAS ZWEITE BITPLANE, AUF DEM
; DER TEXT2 KOMMT
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 #BITPLANE,d0 ; in d0 kommt die Adresse des PIC
LEA BPLPOINTERS,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 Adresse des Plnae
; POINTEN AUF UNSER BITPLANE
MOVE.L #BITPLANE2,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
LEA TEXT(PC),A0 ; Adresse des zu schreibenden Textes in a0
LEA BITPLANE,A3 ; Adresse des Ziel-Bitplanes in a3
bsr.w print ; Bringt den Text auf den Bildschirm
LEA TEXT2(PC),A0 ; Adresse des zu schreibenden Textes in a0
LEA BITPLANE2,A3 ; Adresse des Ziel-Bitplanes in a3
bsr.w print ; Bringt den Text auf den Bildschirm
mouse:
btst #6,$bfe001 ; linke Maustaste gedrückt?
bne.s mouse ; wenn nicht, zurück zu 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:
MOVEQ #27-1,D3 ; ANZAHL DER ZEILEN, DIE ZU DRUCKEN SIND -> 26
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: 40
; 1111111111222222222233333333334
; 1234567890123456789012345678901234567890
dc.b ' ERSTE ZEILE (nur TEXT1) ' ; 1
dc.b ' ' ; 2
dc.b ' /\ / ' ; 3
dc.b ' / \/ ' ; 4
dc.b ' ' ; 5
dc.b ' SECHSTE ZEILE (beide Bitplanes) ' ; 6
dc.b ' ' ; 7
dc.b ' ' ; 8
dc.b 'FABIO CIUCCI INTERNATIONAL' ; 9
dc.b ' ' ; 10
dc.b ' 1 4 6 89 !@ $ ^& () +| =- ]{ ' ; 11
dc.b ' ' ; 12
dc.b ' I H D N E, L O BIN I H ' ; 13
dc.b ' ' ; 24
dc.b ' ' ; 15
dc.b ' Das Fraeulein stand am Meere, ' ; 16
dc.b ' ' ; 17
dc.b ' Und seufzte lang und bang, ' ; 18
dc.b ' ' ; 19
dc.b ' Es ruehrte sie so sehre, ' ; 20
dc.b ' ' ; 21
dc.b ' Sonnenuntergang. ' ; 22
dc.b ' ' ; 23
dc.b ' ... ' ; 24
dc.b ' ' ; 25
dc.b ' ' ; 26
dc.b ' ' ; 27
EVEN
TEXT2:
; Anzahl Charakter pro Zeile: 40
; 1111111111222222222233333333334
; 1234567890123456789012345678901234567890
dc.b ' ' ; 1
dc.b ' ZWEITE ZEILE (nur TEXT2) ' ; 2
dc.b ' /\ / ' ; 3
dc.b ' / \/ ' ; 4
dc.b ' ' ; 5
dc.b ' SECHSTE ZEILE (beide Bitplanes) ' ; 6
dc.b ' ' ; 7
dc.b ' ' ; 8
dc.b 'FABIO COMMUNICATION INTERNATIONAL' ; 9
dc.b ' ' ; 10
dc.b ' 1234567 90 @#$%^&*( _+|\=-[]{} ' ; 11
dc.b ' ' ; 12
dc.b ' ICH DENKE, ALSO ICH ' ; 13
dc.b ' ' ; 14
dc.b ' ' ; 15
dc.b ' Das stand am ' ; 16
dc.b ' ' ; 17
dc.b ' Und s u te l n und b g, ' ; 18
dc.b ' ' ; 19
dc.b ' Es ruehrte sehre, ' ; 20
dc.b ' ' ; 21
dc.b ' Der Sonnen gang. ' ; 22
dc.b ' ' ; 23
dc.b ' ... ' ; 24
dc.b ' ' ; 25
dc.b ' ' ; 26
dc.b ' ' ; 27
EVEN
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,%0010001000000000 ; 2 BITPLANES LOWRES, 4 FARBEN
BPLPOINTERS:
dc.w $e0,$0000,$e2,$0000 ;erstes Bitplane
BPLPOINTERS2:
dc.w $e4,$0000,$e6,$0000 ;zweites Bitplane
dc.w $0180,$000 ; Color0 - SFONDO
dc.w $0182,$19a ; Color1 - SCHRIFT erstes Bitplane (BLAU)
dc.w $0184,$f62 ; Color2 - SCHRIFT zweites Bitplane (ORANGE)
dc.w $0186,$1e4 ; Color3 - SCHRIFT erstes+zweites Bitplane (GRÜN)
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
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
BITPLANE2:
ds.b 40*256 ; ein Bitplane LOWRES 320x256
end
Um den Text in 3 Farben anzuzeigen (4, wenn man den Hintergrund
mitrechnet), braucht man nur ein weiteres Bitplane einschalten, und darauf
den Text2 drucken. Wenn man nun einige Worte oder Buchstaben ausläßt, sei
es nun im einen oder im anderen Bitplane, dann ergeben sich verschiedene
Überlagerungsmuster, die jeweils zu verschiedenen Farben führen. Ihr
erinnert euch ja: Bitplane1 und Bitplane2 aus: Hintergrundfarbe; Bitplane1
aus, Bitplane2 ein Color1, ... , Bitplane1 ein und Bitplane2 ein Color3.
Um beide Texte auszugeben, verwenden wir die gleiche Routine, nur mit
einer kleinen Änderung: die ersten zwei Anweisungen, die den zu druckenden
Text und das ZielBitplane anpointen, werden herausgenommen und vor dem
Aufruf der PRINT: - Routine selbst hingeschrieben. Die Routine verarbeitet
nun jeden Text, der vorher in a0 geladen wurde (dessen Adresse, versteht
sich), und gibt ihn auf das Bitplane aus, auf das a3 pointet.
LEA TEXT(PC),A0 ; Adresse des zu schreibenden Textes in a0
LEA BITPLANE,A3 ; Adresse des Ziel-Bitplanes in a3
bsr.w print ; Bringt den Text auf den Bildschirm
LEA TEXT2(PC),A0 ; Adresse des zu schreibenden Textes in a0
LEA BITPLANE2,A3 ; Adresse des Ziel-Bitplanes in a3
bsr.w print ; Bringt den Text auf den Bildschirm
Somit kann die Routine auf jedes Bitplane und mit jedem Text verwendet
werden, und nicht nur ausschließlich mit dem Bitplane "BITPLANE" und den
Text "TEXT"! Beim ersten bsr.w ist alles wie bei den vorigen Listings,
beim zweiten aber kommt BITPLANE2 und TEXT" zum Zuge. Je nach Überlagerung
der Bitplane kommt es zu einer der folgenden 3 Farben (die erste - Farbe0
- ist wie immer der Hintergrund):
dc.w $0180,$000 ; Color0 - SFONDO
dc.w $0182,$19a ; Color1 - SCHRIFT erstes Bitplane (BLAU)
dc.w $0184,$f62 ; Color2 - SCHRIFT zweites Bitplane (ORANGE)
dc.w $0186,$1e4 ; Color3 - SCHRIFT erstes+zweites Bitplane (GRÜN)
Um das alles ein bißchen besser zu sehen, versucht, das zweite Bitplane um
5 Pixel nach oben zu verschieben:
MOVE.L #BITPLANE2+(40*5),d0