Commodore 64

Das Leben, das Universum und der ganze Rest.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Commodore 64

Beitrag von freecrac »

oDOSseus hat geschrieben:kurze frage:
ich habe im Relaunch64 jetzt n paar Zeilen gecodet und will die mit c64 assemblieren. wie kann ich damit ne .prg erzeugen und im emulator ausführen? danke =)
Äh, regulär wird doch vom Basic aus eine Anwendung erst geladen und dann gestartet, dh es besteht sowohl ein kleines Basic-Listing in dem ein Sys-Befehl von der nächsten freien Speicherstelle enthalten ist und wo unser Assembler/Operationscode beginnt. Einen Exe-Header wie unter MS-DOS gibt es bei den Anwendungen dort nicht. Anwendungen kann man auch in den oberen 4K-Bereich laden und vom Basic aus über "SYS Adresse, Parameter" benutzen, denn dort wird er nicht von Basic selber überschrieben, wenn ein Basic-Listing länger ist.
So langsam kommen einige Errinnerungen zurück.

Dirk
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Commodore 64

Beitrag von oDOSseus »

wärest du so freundlich und kannst mir hier ein Beispiel geben?
Oder jmd. anderes, wenn du grad keinst hast. Ich kann sowas an Beispielen immer am besten verstehen.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Commodore 64

Beitrag von freecrac »

oDOSseus hat geschrieben:wärest du so freundlich und kannst mir hier ein Beispiel geben?
Oder jmd. anderes, wenn du grad keinst hast. Ich kann sowas an Beispielen immer am besten verstehen.
Vorweg, ich kenne Relaunch64 noch nicht, auf der Seite steht noch: "Per Knopfdruck wird der Sourcecode automatisch assembliert, der Emulator gestartet und der Source ausgeführt. "

Bitte poste doch mal dein Listing, auch wenn es fehlerhaft und unvollständig sein sollte. Möglicherweise fällt mir dazu etwas ein. Ich muss erst noch meine grauen Zellen dazu wieder aufwecken.

..
Grummel, grummel, wie war das noch mal, für die indirekte, Indizierte Adressierung benutzt man 2 zusammen hängende Speicheradressen in der Zeropage(Adresse 0 -FF).
Manche Adressen in der Zeropage sind unbenutzt und können dafür benutzt werden. Ich glaube das ist die eleganteste Art auf Tabellen etc. zuzugreifen.
So aus dem Kopf:

Wir wollen 128 Byte vom Inhalt in 4000 nach 5000 kopieren.

START
lda #$00 ; läd in das Akku den wert 0 (LOW-Byte der Adresse)
sta $FB ; Schreibt den Wert im Akku nach Adresse FB
lda #$40 ; läd in das Akku den wert 40 (HIGH-Byte der Adresse)
sta $FC

lda #$00
sta $FD
lda #$50
sta $FE

ldy #$00
ldx #$00

Label1
lda ($FB), y
sta ($FD), x
iny
inx
inx
bne Label1

Habe ich etwas falsch gemacht?

....

Nach etwas mehr googeln habe ich auch ein paar weitere Listing gefunden. In der Demoscene tauchen oft Adressen von Videochip(VIC) und Soundchip(SID) auf. Hier ist ein Demo für Sprites.
http://cdn2.ocaoimh.ie/wp-content/uploa ... 0000000000

Dirk
Zuletzt geändert von freecrac am Mi 2. Mär 2011, 19:58, insgesamt 1-mal geändert.
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Commodore 64

Beitrag von oDOSseus »

Ich hab den Beispielsource-code der Seite ACME genommen:

Code: Alles auswählen

!to "test.bin",cbm
!cpu 6502
*=$1000


; set screencolor and border to black (0)

start

   lda#$00
   sta$d020
   sta$d021
   rts

und dann mit ACME compiliert.
dabei entsteht (wie die erste Zeile schon befielt) eine binary file. Aber was soll ich ab da tun?
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Commodore 64

Beitrag von freecrac »

oDOSseus hat geschrieben:Ich hab den Beispielsource-code der Seite ACME genommen:

Code: Alles auswählen

!to "test.bin",cbm
!cpu 6502
*=$1000


; set screencolor and border to black (0)

start

   lda#$00
   sta$d020
   sta$d021
   rts

und dann mit ACME compiliert.
dabei entsteht (wie die erste Zeile schon befielt) eine binary file. Aber was soll ich ab da tun?
Mit "SYS <memory adress>" ausführen? :idea:

Dieses probiere ich gleich mal aus: http://e-tradition.net/bytes/6502/assembler.html

Noch ein 6502 Instruction Set:
http://e-tradition.net/bytes/6502/6502_ ... n_set.html

Dirk
elianda
DOS-Übermensch
Beiträge: 1150
Registriert: Mi 31. Jan 2007, 19:04
Wohnort: Halle
Kontaktdaten:

Re: Commodore 64

Beitrag von elianda »

Das * steht fuer Origin und setzt die aktuelle Speicheradresse. Also heisst *=$1000, dass der Assembler bei $1000 steht, wenn die ersten Befehle kommen.
d.h. du startest mit
sys 4096
oder falls du im Emulator ein Action Replay eingebunden hast, dann kannst Du auch hexadezimale Zahlen nehmen und direkt sys $1000 eingeben.
(Ich wuerde dir waermstens empfehlen zumindest ein AR MK6 einzuinden.)

Ansonsten gilt folgendes:
Die ersten beiden Bytes in einem PRG File geben die Adresse an, wohin die weiteren Daten geladen werden.
Dein Programm File startet vermutlich mit 00 10 A9 00 usw.
Dabei steht 00 10 fuer $1000 (low high) und dann A9 00 fuer LDA und impliziter Operand #00.
Diverse Retro-Computer vorhanden.
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Commodore 64

Beitrag von oDOSseus »

Hey es klappt =)
und schon habe ich ein Lächeln in meinem Gesicht, wie immer, wenn Assembler tut, was es tun sollte =)
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Commodore 64

Beitrag von freecrac »

elianda hat geschrieben:Ansonsten gilt folgendes:
Die ersten beiden Bytes in einem PRG File geben die Adresse an, wohin die weiteren Daten geladen werden.
Ups, jetzt wo du es erwähnst, da fällt es mir auch wieder ein.

Dirk
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Commodore 64

Beitrag von freecrac »

oDOSseus hat geschrieben:Hey es klappt =)
und schon habe ich ein Lächeln in meinem Gesicht, wie immer, wenn Assembler tut, was es tun sollte =)
Super.

...

Tschuldige wenn ich ein klein wenig vom eigentlichen Thema abkomme, aber eine Frage drängt sich mir hierzu auf.
Ich habe es schon erlebt das ein Monitor für DOS so eingestellt war, das man gar keinen Rahmen mehr sehen konnte.
Gibt es eigentlich auch andere DOS-Anwendungen die eine Rahmenfarbe ungleich null einschalten, wie z.B. mein DOS-Textbetrachter es tut?

Dirk
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Commodore 64

Beitrag von DOSferatu »

Man kann die Rahmenfarbe mit einem INT-Aufruf ändern. Ist eine Funktion des INT 10h. (Hab ich jetzt grad nicht im Kopf, weil ichs selten brauche. Habe es aber in meinem "Wie funktioniert Grafik" Text auf meiner Webseite stehen: http://www.imperial-games.de/html/dosd2.htm

Zu C64: Habe mal unter DOS einen C64-Emulator programmiert, dementsprechend habe ich auch einige Dokus (Befehlslisten, Registerbelegungen...) hier. Kann das ganze Zeug ja mal raussuchen...
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Commodore 64

Beitrag von oDOSseus »

Meint ihr gerade MS-DOS oder irgendein anderes DOS?
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Commodore 64

Beitrag von DOSferatu »

Also, was mich angeht: Ich meine IMMER MS-DOS. Hab noch mit keinem anderen DOS gearbeitet. Der Grund: Ich arbeite sozusagen mit dem "kleinsten gemeinsamen Teiler", damit es möglichst überall kompatibel ist.
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Commodore 64

Beitrag von oDOSseus »

Achso okay=)
ich dachte ja nur, weil es ja auch OS (pl.) (und DOS (pl.)) für den C=64 gab

Eine Frage habe ich noch zum Programmieren:
Darf ich meine Variablen einfach überall in die RAM (die, die keine festgelegt Bedeutung hat) poken? Es scheint so, als müsste ich nicht, wie bei DOS, RAM für Strings etc. anmelden/alociieren/reservieren, sondern kann einfach überall reinschreiben. Stimmt das so? Fände ich seltsam
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Commodore 64

Beitrag von DOSferatu »

OK, dann gebe ich mal ein paar Informationen raus:

Ja, man muß nichts alloziieren. Wenn man in BASIC programmieren will, sind eben einige Speicherstellen (besonders die von 0 bis 1023) belegt (wobei da einige Bereiche "frei", bzw "quasi frei" sind). Programmiert man in ASM, hat man wirklich (fast) den ganzen 64kB Speicher für sich alleine.
Grund: DIe speziellen Chips (VIC, SID, CIA1, CIA2, FarbRam, sowie die 2x 256 Bytes für Cartridges) sind auf den Speicherbereich $D000 bis $DFFF "aufgemappt", der CHARSET-ROM ebenfalls. Der BASIC-ROM liegt an $A000 bis $BFFF, der KERNEL an $E000 bis $FFFF....
ABER:
Die sind an derselben Stelle wie der RAM! Die Speicherstellen 0 und 1 sind quasi "Ports", man kann da mit Bits umschalten, ob man gerade auf ROM, RAM oder "Spezial" zugreift. Außerdem greift der VIC (Grafikchip) etwas komisch auf den RAM zu: An RAM Adessen $1000 bis $1FFF und $9000 bis $9FFF wird (nur aus Sicht des VIC!) der Zeichensatz eingeblendet, so daß man dahin keine eigene Grafik legen kann. (Das ist wohl auch der Grund, warum viele Leute genau an die Stelle $1000 bis $1FFF ihre Soundroutinen legen...)
Die "Zeropage" hat, wie schon erwähnt, besondere Eigenschaften: Die X-Indirekt-Indiziert und Indirekt-Y-indizierte Adressierungsart (JA, ich schreibe mit Absicht das X davor und das Y in die Mitte!) sind nur mit Hilfe der Zeropage möglich.
Viele Zeropage-Adressen werden vom C64-BASIC benutzt, z.B., um den belegten Programmspeicher, Variablebspeicher und Stringspeicher zu markieren... (Oh ja, erinnert sich noch jemand an die "Garbage Collection"? Übrigens funktioniert die Figur-Speicherbelegung meines GameSys2 nach einem recht ähnlichen Prinzip...)
Anders ausgedrückt: Man hat wirklich den ganzen RAM von Speicherstelle 2 (übrigens eine unbenutzte Speicherstelle...) bis Speicherstelle $FFFF zur freien Verfügung.
ABER VORSICHT:
Die 6 letzten Speicherstellen haben eine besondere Funktion! Wenn ROM aktiv ist, werden sie aus dem ROM gelesen, sonst aus dem RAM! Und zwar enthalten diese spezielle Sprungadressen, die nicht veränderlich sind, sondern hardwaremäßig an die CPU (MOS6510 bzw MOS6502) gebunden!
$FFFA+$FFFB = Wordadresse für IRQ (Interrupt ReQuest)
$FFFC+$FFFD = Wordadresse für RESET (Hardware-Reset)
$FFFE+$FFFF = Wordadresse für NMI (Non-Maskable Interrupt)
(Schaltet man auf RAM um, sollte man diese Adressen also entweder aus dem ROM kopieren oder auf valide Adressen von entsprechenden Routinen setzen.)
Achja, nochwas: Diese Umschaltung an Speicherstelle (=Port) 1 funktioniert etwas komisch. Man muß ALLE 3 Bereiche OFF haben, um auf den RAM unter $D000-$DFFF zugreifen zu können, ansonsten wirkt jeder Schreib- und Lesezugriff auf die dort eingemappten Chips.
Den restlichen RAM kann man auch BESCHREIBEN, wenn die ROMs angeschaltet sind, SCHREIBzugriffe landen dann immer im RAM. (Dadurch ist es übrigens leicht, etwas aus dem ROM in den RAM zu kopieren...)
Auf die RAM-Speicherstellen 0 und 1, obwohl vorhanden, hat man KEINEN Zugriff. RAMs werden ja aus technischen Gründen nur in Größen von 2er-Potenzen gebaut - aber an Adressen 0 und 1 sind IMMER die beiden Ports eingeblendet - man muß ja in jeder Einstellung Zugriff darauf haben.
Diese beiden Ports sind übrigens der Unterschied zwischen der MOS6502 und der MOS6510. Hab mal gelesen, die 10 ergäbe sich dadurch, daß eben ein 8-Bit breiter Port zusätzlich eingebaut wurde (2+8). Von den 8 Bits sind aber (konstuktionsbedingt durch das Gehäuse) nur 6 Pins nach außen geführt. 3 Davon sind für die Umschaltung zwischen den Speicherbereichen und die 3 anderen sind für die Ansteuerung der Datasette.
Benutzeravatar
Nilquader
CONFIG.SYS-Autor
Beiträge: 269
Registriert: Mo 26. Jan 2009, 23:00
Kontaktdaten:

Re: Commodore 64

Beitrag von Nilquader »

oDOSseus hat geschrieben: Eine Frage habe ich noch zum Programmieren:
Darf ich meine Variablen einfach überall in die RAM (die, die keine festgelegt Bedeutung hat) poken? Es scheint so, als müsste ich nicht, wie bei DOS, RAM für Strings etc. anmelden/alociieren/reservieren, sondern kann einfach überall reinschreiben. Stimmt das so? Fände ich seltsam
Ja, darfst du! Du musst dich halt selbst darum kümmern, dass du nichts wichtiges überschreibst oder doppelt verwendest. Fast jeder Assembler unterstützt dich aber ein wenig, da du ja symbolische Namen für Speicherstellen vergeben kannst.

Ähh, Die RAM? Wäre mir neu...

Edit: Da war wohl jemand schneller uns ausführlicher als ich...
Pentium II, 266MHz, 64 MB RAM, 3.2 GB HDD, Voodoo 3 2000, SB AWE64 Gold, 1GB SD mit NC100SDv2-Adapter
Antworten