You are not logged in.

kairo

Unregistered

1

Tuesday, October 21st 2003, 2:12pm

Newbie: Frage zu Code-Beispiel

Hallo!

Ich versuche mich seit ca. 3 Wochen in Assembler und komme nur mäßig voran. Zum Glück bin ich nun auf einige Seiten im Netz gestoßen, mit denen ich ein Stückchen weiter gekommen bin.
Auf der Seite von puterman habe ich einen Code gefunden, mit dem ein Sprite auf und ab bewegt werden soll. Allerdings bewegt sich mein Sprite (läuft in VICE, ich benutze den Turboassembler V7) nur von links-oben nach rechts-unten und bleibt dann dort. Kann mir jemand sagen, warum?

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Here's an example that moves a sprite around on the screen:

           * = $0801

           lda #$01
           sta $d015    ; Turn sprite 0 on
           sta $d027    ; Make it white
           lda #$40
           sta $d000    ; set x coordinate to 40
           sta $d001    ; set y coordinate to 40
           lda #$80
           sta $07f8    ; set pointer: sprite data at $2000

mainloop
           lda $d012
           cmp #$ff     ; raster beam at line $ff?
           bne mainloop ; no: go to mainloop

           lda dir      ; in which direction are we moving?
           beq down     ; if 0, down

                        ; moving up
           ldx coord    ; get coord
           dex          ; decrement it
           stx coord    ; store it
           stx $d000    ; set sprite coords
           stx $d001
           cpx #$40     ; if it's not equal to $40...
           bne mainloop ; just go back to the mainloop

           lda #$00     ; otherwise, change direction
           sta dir
           jmp mainloop

down
           ldx coord    ; this should be familiar
           inx
           stx coord
           stx $d000
           stx $d001
           cpx #$e0
           bne mainloop

           lda #$01
           sta dir
           jmp mainloop

coord
           .byte $40   ; current x and y coordinate
dir
           .byte 0     ; direction: 0 = down-right, 1 = up-left 

Dann noch zwei allgemeinere Fragen:
- Wie habt ihr eigentlich den Einstig in Assembler geschafft? Doch wohl nicht mit Data Becker-Büchern, oder etwa doch? Mich verwirren die nur noch mehr.
- Wie bekomme ich denn die Sprite-Daten in $2000? Mit dem Monitor von VICE?

WhiskiX

Unregistered

2

Tuesday, October 21st 2003, 2:27pm

Doch mit Data Becker-Büchern :D
Ich nutze auch den Turbo Assembler (wenn auch aufm CPC). Ich machs immer so: Ich lad die Daten die ich brauch in den Speicher und generiere mir dann im Turboassembler entsprechende .BYTE oder .WORD - Zeilen (ESC+6 bzw. Pfeil-links+6 am C64, wenns denn gleichgeblieben ist), so hab ich das alles gleich im Code und kanns ja eventuell nur noch kopieren.

Was mir oft passiert, ich vergess das CP (beim C64 CMP) - aber ich glaube das braucht man am C64 nicht, oder?

This post has been edited 1 times, last edit by "WhiskiX" (Oct 21st 2003, 2:36pm)


Thomas H

Unregistered

3

Tuesday, October 21st 2003, 2:39pm

RE: Newbie: Frage zu Code-Beispiel

Hallo kairo

Quoted

Original von kairo
Hallo!

Ich versuche mich seit ca. 3 Wochen in Assembler und komme nur mäßig voran. Zum Glück bin ich nun auf einige Seiten im Netz gestoßen, mit denen ich ein Stückchen weiter gekommen bin.

...

Dann noch zwei allgemeinere Fragen:
- Wie habt ihr eigentlich den Einstig in Assembler geschafft? Doch wohl nicht mit Data Becker-Büchern, oder etwa doch? Mich verwirren die nur noch mehr.
- Wie bekomme ich denn die Sprite-Daten in $2000? Mit dem Monitor von VICE?


Ich habe auch erst vor ein paar Wochen angefangen und finde, das die
INPUT-64 Assemblerschule für den Einstieg ganz brauchbar ist.

http://members.chello.at/wiener.freiheit/ass/ass.htm

Dort findest Du einerseits Text (als eingescannte jpg) aber auch diskimages, die Beispielprogrammen und einen eigenen Monitor enthalten, mit dessen Einzelschrittsimulator Du die Arbeitsweise des 6510 Schritt für Schritt bzw. Befehl für Befehl nachvollziehen kannst.
Falls Du die Diskimages vom VICE aus benutzen willst, solltest Du
die 40 tracks-option aktivieren.

Ansonste finde ich das 64er Sonderheft Assembler (SH 35) ganz brauchbar, der Kurs führt die einzelnen Befehle nach und nach ein, und bringt beispielprogramme.

In dem Programm konnte ich spontan keinen Fehler erkennen, ich habe mich aber noch nicht so intensiv mit sprites befasst.

Gruß Thomas

Fritz

Unregistered

4

Tuesday, October 21st 2003, 3:04pm

RE: Newbie: Frage zu Code-Beispiel

Quoted

Wie habt ihr eigentlich den Einstig in Assembler geschafft? Doch wohl nicht mit Data Becker-Büchern, oder etwa doch?


Mein Einstieg war es, das Spiel Boulder Dash zu ändern und zu erweitern, was natürlich erstmal das Verstehen des vorhandenen Codes erfordert hat. Von Data-Becker habe ich in diesem Zusammenhang eigentlich nur die ROM-Listings im Buch "64 Intern" genutzt.

Das Lesen, Verstehen und Ändern/Erweitern vorhandener Programmcodes halte ich im übrigen auch bei anderen Programmiersprachen für eine bessere Lernmethode als irgendwelche "Hallo Welt"-Programme nach einem Lehrbuch zu schreiben.

Gruß,
Fritz

Dr.Creep

Unregistered

5

Tuesday, October 21st 2003, 3:13pm

RE: Newbie: Frage zu Code-Beispiel

Quoted

Original von kairo
Allerdings bewegt sich mein Sprite (läuft in VICE, ich benutze den Turboassembler V7) nur von links-oben nach rechts-unten und bleibt dann dort. Kann mir jemand sagen, warum?


Hallo,
mit
stx $d000
und
stx $d001

wird ja auch die X- und Y-Position neu gesetzt, welches natürlich eine diagonale Bewegung zur Folge hat. Es darf nur die Y-Position für senkrechte Bewegung in der Schleife geändert werden.
Außerdem empfielt es sich noch eine Verzögerung einzubauen, sonst wirst Du von einer Bewegung wenig mitbekommen.

Gruß,
Dr.Creep

WhiskiX

Unregistered

6

Tuesday, October 21st 2003, 3:18pm

Das passt schon mit der X- und Y-Koordinate, so solls auch sein (siehe sein Link).

-------------------------Listing-----------------------------------------
coord
.byte $40 ; current x and y coordinate
dir
.byte 0 ; direction: 0 = down-right, 1 = up-left
---------------------------------------------------------------------------


Und die Verzögerung is ja das warten auf Strahl bei $FF - oder?
Korrigiert mich bitte, wenn ich falsch lieg... meine C64-Kenntnisse sind schon sehr...äh....angestaubt...

Gruß,

Brueggi

This post has been edited 1 times, last edit by "WhiskiX" (Oct 21st 2003, 3:20pm)


Fritz

Unregistered

7

Tuesday, October 21st 2003, 3:36pm

Quoted

Original von Brueggi
Und die Verzögerung is ja das warten auf Strahl bei $FF - oder?
Korrigiert mich bitte, wenn ich falsch lieg... meine C64-Kenntnisse sind schon sehr...äh....angestaubt...


Meine auch... aber eine große Verzögerung dürfte das nicht geben, da der Strahl ja 50 mal pro Sekunde bei $FF ist. Das dürfte eher Flackereffekte verhindern.

Auch ich lasse mich gerne korrigieren!

Gruß,
Fritz

Metalmorphosis

Hätte gern ein Bit...

  • "Metalmorphosis" is male

Posts: 413

Date of registration: Apr 22nd 2003

Location: Bomlitz

  • Send private message

member since 108 month member since 108 month member since 108 month member since 108 month member since 108 month member since 108 month

8

Tuesday, October 21st 2003, 3:37pm

Moin!

Probier doch mal zwischen "Lda Dir" und "beq down" "cmp #$01" dazwischenzusetzen.

Ich habe Assembler mittels des 64'er-Sonderheftes 35 gelernt. Schön verständlich, nur einige der Beispielprogramme finde ich ein bißchen merkwürdig. Aber egal, sind ja eh nur Beispiele.

mfg

Metalmorphosis
Du glaubst, Du bist frei?

Thomas H

Unregistered

9

Tuesday, October 21st 2003, 3:51pm

Quoted

Original von Metalmorphosis
Moin!

Probier doch mal zwischen "Lda Dir" und "beq down" "cmp #$01" dazwischenzusetzen.
...



Dann würde das Programm aber in der up-left Schleife hängenbleiben, oder meintest Du statt "cmp #$01" "cmp#$00", was nicht nötwendig ist, da das zero-flag schon beim LDA gesetzt wird (, oder gelöscht)

Gruß Thomas

Metalmorphosis

Hätte gern ein Bit...

  • "Metalmorphosis" is male

Posts: 413

Date of registration: Apr 22nd 2003

Location: Bomlitz

  • Send private message

member since 108 month member since 108 month member since 108 month member since 108 month member since 108 month member since 108 month

10

Tuesday, October 21st 2003, 3:57pm

Quoted

Original von Thomas H
Dann würde das Programm aber in der up-left Schleife hängenbleiben, oder meintest Du statt "cmp #$01" "cmp#$00", was nicht nötwendig ist, da das zero-flag schon beim LDA gesetzt wird (, oder gelöscht)

Gruß Thomas


Was man nicht im Kopf hat, hat man in den Fingern... ;) Ja, ich meinte doch "cmp #$00". Hatte irgendwie #$01 im Kopf gehabt. Und das mit dem Zero-Flag hatte ich gerade nicht dran gedacht.

mfg

Metalmorphosis
Du glaubst, Du bist frei?

LordNikon

Professional

  • "LordNikon" is male

Posts: 1,303

Date of registration: Nov 24th 2002

Location: Sachsen

  • Send private message

member since 126 month member since 126 month member since 126 month member since 126 month member since 126 month member since 126 month member since 126 month

11

Tuesday, October 21st 2003, 4:30pm

nachdem durcheinander hier, sieht wohl kairo nicht mehr durch ;)

aber nur mal so als "klenner Dibbb" hohl dir doch mal die Mail Madness ab Ausgabe 32 glaub ich... und lies dir mal dort die Assemblerkurse durch... ich habs so einfach wie moeglich gehalten ;)


http://www.mr-museum.de <- mail madness download

Pohli

Professional

  • "Pohli" is male

Posts: 1,329

Date of registration: Jan 19th 2003

Location: Dortmund

  • Send private message

member since 108 month member since 108 month member since 108 month member since 108 month member since 108 month member since 108 month

12

Tuesday, October 21st 2003, 6:29pm

Du kannst auch mal einen Blick in diesen Thread werfen.
Dort gibt's einen kleinen Anfängerkurs, der verständlicher für Newbies kaum sein kann. Ist aber nichts Großes, ist mehr dafür gedacht, um einen Einstieg zu bekommen, dafür aber sehr praxisnah.
Ich hab's auch noch als txt-Datei, kann ich dir zuschicken, wenn du willst.
Zusammen können wir's schaffen! ;) C64-Wiki

kairo

Unregistered

13

Tuesday, October 21st 2003, 10:23pm

Vielen Dank erst einmal für all die netten Antworten, die Leseempfehlungen und die Links! Ich arbeite das in der nächsten Zeit durch.

Hat jemand denn eine Idee, warum das (der?) Sprite rechts-unten hängenbleibt?

@brueggi:
Die Lösung verstehe ich im Ansatz, aber ich kann mir praktisch nichts darunter vorstellen ... Woher, z.B., bekommst du die Daten, die du lädst? Wie bekomme ich sie denn an die Speicherstelle $2000?

@Pohli:
Die ausgezeichnete Einführung von biguser kenn ich schon. Durch die bin ich überhaupt erst in diesem Forum gelandet. Von einer anderen Seite wurde darauf verlinkt.

14

Tuesday, October 21st 2003, 10:56pm

Hi!

Habe den Code mal getestet (nachdem ich auch nix fand) und er läuft einwandfrei. Keine Ahnung was da abgeht. Höchstens mal den assemblierten Code mittels Monitor abgleichen, ob der Assembler da irgendwas nicht richtig assembliert.

kairo

Unregistered

15

Monday, October 27th 2003, 10:21pm

Ich muss noch einmal nachhaken. Ich bin wohl etwas blöd ...

Wie bekomme ich meine Spritedaten in die Speicherstelle $2000?

Ich habe mein ASM-Programm ab $0801 - und nun? Ich habe bereits vorher ein Basic-Programm mit Sprites laufen lassen, aber dann kam anschließend nichts. Ich hab es bisher nur mal geschafft, mit dem Monitor irgendwelchen müll ab $2000 einzutragen, aber das ist doch nicht die Lösung, oder? Kann ich im Assembler nicht die Daten in die Speicherstelle schreiben?

Danke!

WhiskiX

Unregistered

16

Monday, October 27th 2003, 10:35pm

Hi.

Ich bekomme meine Daten einfach mit BASIC mit LOAD"name",adresse an die richtige Stelle (CPC) - aber beim C64 wirst du wohl oder übel nicht drum rum kommen, die Daten per Programm-Code nachzuladen - da können dir sicherlich die ganzen C=-Freaks hier besser helfen - ich weiss leider so gut wie garnix mehr über den C64. Schwer ist es allerdings nicht - das Betriebssystem des C64 ist da ganz hilfreich, das LOAD"name",adresse zu ersetzen - hab das früher auch immer so gemacht.

Du kannst die Sprite-Daten auch per BASIC-Programm an die richtige Stelle poken und dann in den Assembler-Code einfügen - dann musst Du nur noch eine kleine Kopierroutine schreiben, damit die Daten dann wieder an der richtigen Stelle landen.

Vergess aber nicht die Spritepointer (ich glaub ab 2040) auf deine Daten zeigen zu lassen.

Gruß,

Brueggi

This post has been edited 2 times, last edit by "WhiskiX" (Oct 27th 2003, 10:38pm)


biguser

Intermediate

  • "biguser" is male

Posts: 318

Date of registration: Nov 25th 2002

  • Send private message

member since 126 month member since 126 month member since 126 month member since 126 month member since 126 month member since 126 month member since 126 month

17

Monday, October 27th 2003, 11:20pm

Daten in Speicherbereiche mit einem Monitor laden

@Kairo: Benutzt du ein Modul am C64? Ein Action Replay oder Final Cartridge wäre da nicht schlecht! Du kannst mit den eingebauten Monitoren ganz leicht Daten aus einer Datei, in einen bestimmten Speicherbereich laden. Das ganze geht auch mit einem separatem Monitor von der Disk, aber du solltest darauf achten, das der Speicherbereich (in dem der Mon selbst liegt) nicht überladen wird! Bei den Modul Monitoren hast du den kompletten Speicher frei, und brauchst nicht aufpassen.

Syntax Befehlszeile:
.l"filename",laufwerk,hexadresse

in deinem fall als beispiel:
.l"sprites",8,2000



Das gleiche geht auch, wenn du einen Speicherbereich saven willst:
.s"sprites",8,2000,3000

Hier savest du die Daten vom Speicherbereich $2000 bis $3000 auf Laufwerk 8!
Die obige syntax beziehen sich auf die Action Replay & Final Cartridge Monitore. bei Disk Monitoren kann das etwas abweichen.

This post has been edited 1 times, last edit by "biguser" (Oct 27th 2003, 11:21pm)