home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings2
/
listing6p.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
7KB
|
233 lines
; Listing6p.s DRUCKEN EINEN BUCHSTABEN PRO FRAME AUF DEN
; BILDSCHIRM
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 #BITPLANE,d0
LEA BPLPOINTERS,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
mouse:
cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
bne.s mouse
bsr.w PRINTCharakter ; Drucken einen Buchstaben pro Frame
Warte:
cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
beq.s Warte
btst #6,$bfe001 ; linke Maustaste gedrückt?
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
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
; Diese Routine ist eine Art Mischling zwischen der normalen PRINT-Routine
; und der Tabellenroutine, denn wir verwenden einen Text auf dieselbe Art
; wie es bei der Tabelle der Fall war, einen Wert nach dem anderen, einen
; pro Fotogramm, und der kommt dann auf den Screen. Des Weiteren müssen wir
; auch die Adresse im Bitplane der letzten vom Print erreichten Position
; abspeichern, um den nächsten genau nach ihn setzen zu können. Um zwischen
; einem Frame und dem anderen die Adresse im Text und im Bitplane zu merken,
; verwenden wir zwei Longword als Pointer:
;
; PointeText:
; dc.l TEXT
;
; PointeBitplane:
; dc.l BITPLANE
;
; Jedesmal, wenn die Routine ausgeführt wird, wird ein Buchstabe
; gedruckt, und es wird der Pointer auf TEXT "upgedatet" (mit einem
; ADDQ.L #1, das ihn auf den nächsten Buchstaben bringt, da einer
; genau 1 Byte lang ist) und auch der Pointer auf das Bitplane, denn
; jeder Buchstaben hat seinen Platz im Bitplane.
; Das erste Problem besteht darin, daß alle 40 Zeichen eine neue (Text-)
; Zeile genommen werden muß, also 40*7 Bytes zum Bitplanepointer dazugezählt
; werden muß. Um dieses Problem zu lösen wurde einfach eine NULL am Ende
; einer jeden Textzeile angehängt, die uns mitteilt, daß wir am Ende sind
; und wir 40*7 zum Bitplanepointer und 1 zum Textpointer dazuzählen müssen.
; Das zweite Problem war, daß wir aufhören müssen Buchstaben zu drucken,
; wenn wir am Ende des Textes angekommen sind. Per Konvention schließen wir
; somit die Zeile statt mit $00 mit $FF ab, somit können wir die Routine
; verlassen, wenn wir dieses "Zeichen" erreichen. Einfach das gelesene Byte
; kontrollieren, und wenn es $FF ergibt, nichts mehr drucken, keine Pointer
; verstellen, nix mehr. Wenn wir nun beim nächsten Durchgang wieder auf $FF
; treffen ( weil wir den Pointer nicht vorgestellt haben), wird wieder nichts
; getan, usw.
; Ihr könnt euch mehrere solcher "Spezialzeichen" erfinden, Hauptsache,
; sie liegen nicht im Bereich zwischen $20 und $80, also den Buchstaben
; gewideten Bytes.
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 #40*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)+,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.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 BITPLANE
; $00 für "Ende Zeile" - $FF für "Ende TEXT"
; Anzahl Charakter pro Zeile: 40
TEXT: ; 1111111111222222222233333333334
dc.b ' ERSTE ZEILE ',0 ; 1
dc.b ' ZWEITE ZEILE ',0 ; 2
dc.b ' /\ / ',0 ; 3
dc.b ' / \/ ',0 ; 4
dc.b ' ',0 ; 5
dc.b ' SECHSTE ZEILE ',0 ; 6
dc.b ' ',0 ; 7
dc.b ' ',0 ; 8
dc.b 'FABIO CIUCCI COMMUNICATION INTERNATIONAL',0 ; 9
dc.b ' ',0 ; 10
dc.b ' 1234567890 !@#$%^&*()_+|\=-[]{} ',0 ; 11
dc.b ' ',0 ; 12
dc.b ' ICH DENKE, ALSO BIN ICH... ',0 ; 15
dc.b ' ',0 ; 16
dc.b ' ',0 ; 17
dc.b ' Das Fraeulein stand am Meere, ',0 ; 18
dc.b ' Und seufzte lang und bang, ',0 ; 19
dc.b ' Es ruehrte sie so sehre, ',0 ; 20
dc.b ' Der Sonnenuntergang. (...) ',0 ; 21
dc.b ' ',0 ; 22
dc.b ' Schon draufgekommen...? Noch nicht...? ',0 ; 23
dc.b ' Es war: . . . . . . . Heinrich Heine ! ',$FF ; 24 Ende
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,%0001001000000000 ; Bit 12 an - 1 Bitplane Lowres
BPLPOINTERS:
dc.w $e0,$0000,$e2,$0000 ;erstes Bitplane
dc.w $0180,$000 ; Color0 - Hintergrund
dc.w $0182,$19a ; Color1 - Schrift
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, 320x256 LowRes
end