home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings2
/
listing5i.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
6KB
|
167 lines
; Listing5i.s DURCHLAUFEN DER GESAMTEN CHIP-MEMORY MITTELS DER BITPLANEPTR
; IN DER COPPERLIST.
; LINKE TASTE UM SICH VORWÄRTS ZU BEWEGEN, RECHTE FÜR RÜCKWÄRTS,
; BEIDE ZUM AUSSTEIGEN.
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
; BEMERKUNG: hier lassen wir die Bitplanes alle auf $000000 pointen,
; also auf den Anfang der CHIP-RAM
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
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.s 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 ; If both buttons are pressed, exit, or MOUSE
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
; Diese Routine bewegt das Bild nach oben und unten, indem es auf die
; Bitplanepointers zugreift (mittels Label BPLPOINTERSin der Copperlist).
GehRunter:
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
sub.l #80*3,d0 ; subtrahieren 80*3, also 3 Zeilen, somit
; scrollt das Bild nach unten
bra.s ENDE
GehRauf:
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
add.l #80*3,d0 ; addieren 80*3, also 3 Zeilen, somit
; scrollt das Bild nach oben
bra.w ENDE
ENDE: ; WIR POINTEN AUF UNSERE BITPLANES
move.w d0,6(a1) ; kopiert das niederw. Word der Adresse des Pl
swap d0 ; vertauscht die 2 Word in d0 (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 Standartwerten)
dc.w $90,$2cc1 ; DiwStop
dc.w $92,$003c ; DdfStart HIRES Normal
dc.w $94,$00d5 ; DdfStop HIRES Normal
dc.w $102,0 ; BplCon1
dc.w $104,0 ; BplCon2
dc.w $108,0 ; Bpl1Mod
dc.w $10a,0 ; Bpl2Mod
; 5432109876543210 ; BPLCON0:
dc.w $100,%1001001000000000 ; Bits 12 und 15 an!! 1 Bitplane
; Hires 640x256, nicht Interlace
BPLPOINTERS:
dc.w $e0,$0000,$e2,$0000 ;erstes Bitplane - BPL0PT
dc.w $0180,$000 ; color0
dc.w $0182,$2ae ; color1
dc.w $FFFF,$FFFE ; Ende der Copperlist
end
Mit diesem simplen Programm könnt ihr den Inhalt eurer Chip-Ram sehen, es
wir ein Bitplane in HIRES angezeigt, das anfänglich auf $00000 zeigt, also
dem Anfang der Chip-Ram des Amiga. Durch drücken der linken Maustaste
könnt ihr die Adresse inkrementieren (erhöhen), mit der rechten Taste
dekrementieren (in der Adresse rückwärts fahren). Damit könnt ihr sehen,
was sich in diesem Bereich alles tummelt: Die Workbench wird erkennbar
sein, der Asmone, und wenn ihr ein Spiel gespielt habt, bevor ihr dieses
Listing testet, werdet ihr vielleicht auch noch dessen Hintergrund und die
Figuren darin sehen. Ja, denn mit einem Reset wird der Speicher nicht
gelöscht, das geschiegt nur bei einem totalen Abschalten.
Mit beiden Tasten könnt ihr aussteigen. Probiert, einige Videospiele zu
laden, einen Reset zu machen und zu sehen, was übrig geblieben ist. Wenn
ihr den Scroll verschnellern wollt, dann müßt ihr den Wert verändern, der
zu den Bitplane dazugezählt wird. Hauptsache, es ist ein Vielfaches von 80
(Ihr wißt ja, die Geschichte mit den 640 Punkten, die 80 Byte ergeben, im
Gegensatz zu den 320 horizontalen Punkten des LowRes, bei dem grade mal 40
Byte pro Zeile zustande kommen).
Im Listing werden 3 Zeilen pro Durchgang genommen:
sub.l #80*3,d0 ; subtrahieren 80*3, also 3 Zeilen
Um den Scroll mit TURBO zu machen, testet ein 80*10 oder mehr. Wenn ihr
aus purer Neugierde wissen möchtet, auf welcher Adresse ein Bitplane
steht, dann steigt aus und tippt "M BPLPOINTERS":
XXXXXX 00 E0 00 02 00 E2 10 C0 ... (00 e0 = bplpointerH, 00 e2 das andere BPLP)
oder $00E0,$0002,$00E2,$10C0 ......
In diesem Beispiel ist die Adresse $0002 10c0, oder $210c0.