home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings
/
listing3f.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
8KB
|
241 lines
; Listing3f.s ; BALKEN, DER RAUF-UND RUNTERGEHT, ERSTELLT MIT MOVE & WAIT
; DER COPPERS, UNTER DER $FF-ZEILE
; Dieses Listing ist identisch mit dem Listing3d.s, mit der
; einzigen Ausnahme, daß der Balken sich unterhalb der $FF-Grenze
; befindet, die wir noch nie überschritten haben.
SECTION CIPundCOP,CODE ; auch Fast ist OK
Anfang:
move.l 4.w,a6 ; Execbase in a6
jsr -$78(a6) ; Disable - stoppt das Multitasking
lea GfxName,a1 ; Adresse des Namen der zu öffnenden Library in a1
jsr -$198(a6) ; OpenLibrary, Routine der EXEC, die Libraris
; öffnet, und als Resultat in d0 die Basisadresse
; derselben Bibliothek liefert, ab welcher
; die Offsets (Distanzen) zu machen sind
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 (immer auf $26 nach
; GfxBase)
move.l #COPPERLIST,$dff080 ; COP1LC - "Zeiger" auf unsere COP
; (deren Adresse)
move.w d0,$dff088 ; COPJMP1 - Starten unsere COP
mouse:
cmpi.b #$ff,$dff006 ; VHPOSR - sind wir bei Zeile 255 angekommen?
bne.s mouse ; Wenn nicht, geh nicht weiter
bsr.s BewegeCopper ; Diese Subroutine läßt das WAIT sinken!
; Sie wird einmal pro Frame ausgeführt.
Warte:
cmpi.b #$ff,$dff006 ; VHPOSR:
; Sind wir noch auf $FF? Wenn ja, warte auf die
beq.s Warte ; nächste Zeile (00). Ansonsten wird BewegeCopper
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
; Die Routine BewegeCopper ist die gleiche geblieben, nur die Werte der
; maximalen bzw. minimalen Höhe haben sich geändert: $0a für das obere
; Limit des Bildschirms und $2c für unten..
BewegeCopper:
LEA BALKEN,a0 ; in a0 kommt die Adresse von Balken
TST.B RAUFRUNTER ; Müßen wir steigen oder sinken? Wenn RaufRunter
; auf 0 steht (wenn TST also BEQ liefert), dann
; springen wir auf GEHRUNTER, wenn es hingegen
; auf $FF ist (TST also nicht eintrifft), fahren
beq.w GEHRUNTER ; wir fort und führen somit den "steigenden" Teil
; aus
cmpi.b #$0a,(a0) ; sind wir bei Zeile $0a+$ff angekommen?
beq.s SetzRunter ; wenn ja, sind wir oben angekommen und
subq.b #1,(a0) ; müßen runter
subq.b #1,8(a0)
subq.b #1,8*2(a0) ; nun ändern wir die anderen Wait: der
subq.b #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
subq.b #1,8*4(a0) ; 8 Byte
subq.b #1,8*5(a0)
subq.b #1,8*6(a0)
subq.b #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
subq.b #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
subq.b #1,8*9(a0) ; wollen.
rts
SetzRunter:
clr.b RAUFRUNTER ; Setzt RAUFRUNTER auf 0, beim TST.B RAUFRUNTER
rts ; wird das BEQ zu Routine GEHRUNTER verzweigen,
; und der Balken wird sinken
GEHRUNTER:
cmpi.b #$2c,8*9(a0) ; sind wir bei Zeile $2c angekommen?
beq.s SetzRauf ; wenn ja, sind wir untern und müßen wieder
addq.b #1,(a0) ; steigen
addq.b #1,8(a0)
addq.b #1,8*2(a0) ; nun ändern wir die anderen Wait: der
addq.b #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
addq.b #1,8*4(a0) ; 8 Byte
addq.b #1,8*5(a0)
addq.b #1,8*6(a0)
addq.b #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
addq.b #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
addq.b #1,8*9(a0) ; wollen.
rts
SetzRauf:
move.b #$ff,RAUFRUNTER ; Wenn das Label nicht auf NULL ist,
rts ; bedeutet es, daß wir steigen müßen
; Dieses Byte, das von dem Label RAUFRUNTER markiert ist, ist ein FLAG,
; also eine "Fahne" (man kann es sich so vorstellen), einmal ist sie
; auf $FF, ein anderes Mal auf $00, je nachdem ob wir steigen oder sinken
; müßen! Es ist wie eine Flagge, denn wenn sie unten ist ($00) bedeutet
; es, daß wir runter müßen, wenn sie gehißt ist ($FF), dann müßen wir
; rauf. Es wird eine Kontrolle gemacht, auf welcher Zeile wir uns
; befinden, und verglichen, ob wir oben oder unter angelangt sind. Ist
; das der Fall, dann sagt uns das Flag, welche Richtung wir danach
; einschlagen müßen, und dann ändern wir ihren Zustand mit clr.b RAUFRUNTER
; oder move.b #$ff,RAUFRUNTER.
; DATEN...
RAUFRUNTER:
dc.b 0,0
GfxName:
dc.b "graphics.library",0,0 ; Bemerkung: um Charakter in den
; Speicher zu geben, verwenden wir
; immer das dc.b und setzen sie
; unter "" oder ´´, Abschluß mit ,0
GfxBase: ; Hier hinein kommt die Basisadresse der graphics.library,
dc.l 0 ; ab hier werden die Offsets gemacht
OldCop: ; Hier hinein kommt die Adresse der Orginal-Copperlist des
dc.l 0 ; Betriebssystemes
SECTION GRAPHIC,DATA_C ; Dieser Befehl veranlaßt das Betriebssystem,
; das folgende Datensegment in die CHIP-RAM
; zu laden, obligatorisch.
; Die Cpperlist MÜSSEN in die CHIP RAM!
COPPERLIST:
dc.w $100,$200 ; BPLCON0
dc.w $180,$000 ; COLOR0 - Beginne Cop mit SCHWARZ
dc.w $2c07,$FFFE ; WAIT - Ein kleiner fixer Balken in grün
dc.w $180,$010 ; COLOR0
dc.w $2d07,$FFFE ; WAIT
dc.w $180,$020 ; COLOR0
dc.w $2e07,$FFFE
dc.w $180,$030
dc.w $2f07,$FFFE
dc.w $180,$040
dc.w $3007,$FFFE
dc.w $180,$030
dc.w $3107,$FFFE
dc.w $180,$020
dc.w $3207,$FFFE
dc.w $180,$010
dc.w $3307,$FFFE
dc.w $180,$000
dc.w $ffdf,$fffe ; ACHTUNG! WAIT AM ENDE DER ZEILE FF!
; die folgenden Wait sind unter der Zeile
; $FF und starten wieder bei $00!!
dc.w $0107,$FFFE ; Ein fixer, grüner Balken UNTER der Zeile $FF!
dc.w $180,$010
dc.w $0207,$FFFE
dc.w $180,$020
dc.w $0307,$FFFE
dc.w $180,$030
dc.w $0407,$FFFE
dc.w $180,$040
dc.w $0507,$FFFE
dc.w $180,$030
dc.w $0607,$FFFE
dc.w $180,$020
dc.w $0707,$FFFE
dc.w $180,$010
dc.w $0807,$FFFE
dc.w $180,$000
BALKEN:
dc.w $0907,$FFFE ; Warte auf Zeile $79
dc.w $180,$300 ; Beginne roten Balken: Rot auf 3
dc.w $0a07,$FFFE ; nächste Zeile
dc.w $180,$600 ; Rot auf 6
dc.w $0b07,$FFFE
dc.w $180,$900 ; Rot auf 9
dc.w $0c07,$FFFE
dc.w $180,$c00 ; Rot auf 12
dc.w $0d07,$FFFE
dc.w $180,$f00 ; Rot auf 15 (Maximum)
dc.w $0e07,$FFFE
dc.w $180,$c00 ; Rot auf 12
dc.w $0f07,$FFFE
dc.w $180,$900 ; Rot auf 9
dc.w $1007,$FFFE
dc.w $180,$600 ; Rot auf 6
dc.w $1107,$FFFE
dc.w $180,$300 ; Rot auf 3
dc.w $1207,$FFFE
dc.w $180,$000 ; Farbe SCHWARZ
dc.w $FFFF,$FFFE ; ENDE DER COPPERLIST
end
EIN WUNDER! Wir haben es geschafft, farbige Balken unter die
berühmt-berüchtigte Zeile $FF zu setzen! Und es reicht der Befehl
dc.w $ffdf,$fffe
und bei $0107 starten, um im unteren Teil des Bildschirmes zu aaiten. Das
ist so, weil ein Byte nur 256 Werte darstellen kann, also bis $FF. Das
bedeutet, daß wenn wir eine Zeile abwarten wollen, die unter $FF liegt,
wir $FFdf,$FFFE schreiben müßen, danach startet die Numerierung wieder bei
NULL, und geht soweit, wie der Bildschirm halt reicht, ca bis $30. Zu
Bemerken ist, daß der amerikanische Fernsehstandart NTSC nur bis zur Zeile
$FF kommt, oder knapp mehr in Overscan, die Amerikaner sehen also den
unteren Teil des Bildes nicht. Aber das kümmert uns nur wenig, da der
Amiga ja vor allem in Europa verbreitet ist, und die meisten Demos oder
Spiele ja eh in PAL geschrieben sind. In manchen Fällen machen die
Spieleprogrammierer eine NTSC-Version, die dann ausschließlich für den
Markt in den USA bestimmt ist.
Bemerkung: Bisher konnten wir mit dem $dff006 nur Zeilen bis $FF abfragen,
ich werde euch später beibringen, wie man mit einem $dffxxx eine Zeile
nach $FF korrekt abfragt.