Commodore 64

Das Leben, das Universum und der ganze Rest.
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Commodore 64

Beitrag von oDOSseus »

Danke euch beiden =)
Über Dosferatus sehr ausführlichen Post muss ich noch länger nachdenken xD. Was nicht heißen soll, dass er unverständlich ist.
Wenn ich in Assemblersprache Programmiere müsste ich doch der/das Basic-Ram ($0800-$9FFF) vollständig beschreiben dürfen oder? muss ich den nachher wieder per Hand leeren oder weiß der C=64, dass kein Basic-Programm geladen is und der Bereich frei sein müsste?
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Commodore 64

Beitrag von freecrac »

DOSferatu hat geschrieben: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
Ja genau.

RBIL->inter61a.zip->Interrup.a
--------V-100B--BH00-------------------------
INT 10 - VIDEO - SET BACKGROUND/BORDER COLOR
AH = 0Bh
BH = 00h
BL = background/border color (border only in text modes)
Return: nothing
SeeAlso: AH=0Bh/BH=01h
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...
Prima, denn ich habe meine C64-Bücher, Disketten, etc. alle schon einem Freund geschenkt.

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

Re: Commodore 64

Beitrag von freecrac »

DOSferatu hat geschrieben: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.
Bei mir ebenso, ich meine auch immer MS-DOS wenn ich von DOS rede.

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

Re: Commodore 64

Beitrag von DOSferatu »

oDOSseus hat geschrieben:Wenn ich in Assemblersprache Programmiere müsste ich doch der/das Basic-Ram ($0800-$9FFF) vollständig beschreiben dürfen oder? muss ich den nachher wieder per Hand leeren oder weiß der C=64, dass kein Basic-Programm geladen is und der Bereich frei sein müsste?
Ja, kannste alles beschreiben. Übrigens: Der Bereich $C000 bis $CFFF wird weder vom C64-"OS" benutzt, noch vom BASIC. Wenn man also BASIC und ASM mal testweise kombinieren will, ist der Bereich ab $C000 am besten geeignet, weil man sich da mit absoluter Sicherheit mit NIX in die Quere kommt.
zu BASIC: Man muß keinen Speicherbereich ,"leeren" oder so (wie soll das auch aussehen?). Vergiß einfach, in PC-Kategorien zu denken. Es ist einfach Speicher, da kann drinstehen, was will.
Und: Beim C64 gibt es zwar relative Sprungbefehle (Reichweite -128 bis +127), aber ansonsten wird quasi fast überall mit absoluten Adressen gearbeitet. (Der C64 ist ja auch ein Singletask-System...)
Nur nicht zu kompliziert denken bei dem Ding! Es ist alles genauso, wie es aussieht.
(OK, vielleicht sollte man erwähnen, daß es viele Dinge gibt, die konstruktionsbedingt "seltsame Dinge tun" - was quasi schon nach kurzer Zeit von vielen Programmierern ausgenutzt wurde, um damit viel "coolere" Sachen zu machen, als eigentlich technisch vorgesehen war... Bei manchen Spielen versucht man z.B. die 8 vorhandenen Sprites zu zählen und kommt irgendwie auf 20 oder noch mehr... Aber das alles aufzuzählen, würde jetzt zu weit führen.)
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Commodore 64

Beitrag von oDOSseus »

DOSferatu hat geschrieben: zu BASIC: Man muß keinen Speicherbereich ,"leeren" oder so (wie soll das auch aussehen?).)
Vllt. hätte ich es mit "0" beschreiben müssen, da sonst der Basic-Interpreter, der das Basic-Programm interpretiert, dass das ASM-Porgramm aufruft (SYS), denkt, er müsse weiterabeiten und dann steht da nur müll drin. Ich hoffe du verstehst wie ich das meine. Hätte ja unter umständen sein können.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Commodore 64

Beitrag von freecrac »

DOSferatu hat geschrieben:
oDOSseus hat geschrieben:Wenn ich in Assemblersprache Programmiere müsste ich doch der/das Basic-Ram ($0800-$9FFF) vollständig beschreiben dürfen oder? muss ich den nachher wieder per Hand leeren oder weiß der C=64, dass kein Basic-Programm geladen is und der Bereich frei sein müsste?
Ja, kannste alles beschreiben.
Ich glaube unbenutzter RAM beinhaltet eine Null.
Übrigens: Der Bereich $C000 bis $CFFF wird weder vom C64-"OS" benutzt, noch vom BASIC. Wenn man also BASIC und ASM mal testweise kombinieren will, ist der Bereich ab $C000 am besten geeignet, weil man sich da mit absoluter Sicherheit mit NIX in die Quere kommt.
Ja genau, dieser 4 KiB große Bereich eignet sich bestens um dort kleine Hilfsprogramme einzuladen, um sie von einem Basic-Listing aus zu verwenden. Der Ansprung kann über ein SYS-Befehl erfolgen.
zu BASIC: Man muß keinen Speicherbereich ,"leeren" oder so (wie soll das auch aussehen?).
Mit einer Schleife könnte man dort Nullen hineinschreiben.
Vergiß einfach, in PC-Kategorien zu denken. Es ist einfach Speicher, da kann drinstehen, was will.
Ich glaube der Ram beim PC ist nach dem POST auch auf Null gesetzt.
Und: Beim C64 gibt es zwar relative Sprungbefehle (Reichweite -128 bis +127), aber ansonsten wird quasi fast überall mit absoluten Adressen gearbeitet. (Der C64 ist ja auch ein Singletask-System...)
Nur nicht zu kompliziert denken bei dem Ding! Es ist alles genauso, wie es aussieht.
Beim Umstieg vom C64er zum PC habe ich ähnlich gedacht. Dort sind mehrere kleine C64er drin, die sich den Speicher in 64Kib große Bereiche aufteilen und jeder Bereich bekommt ein Segmentregister,
aber nur falls man irgendwann in noch ferner Zukunft einmal mehr als 64 Kib benötigten sollte. ;-)

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

Re: Commodore 64

Beitrag von elianda »

DOSferatu hat geschrieben: $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)
[...]
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.
Das ist soweit richtig, vielleicht noch als Ergänzung:
NMI kann man per CIA abschalten.
IRQ kann man per SEI verhindern.
Die RAM Speicherstellen 0 und 1 kann man per VIC auslesen, indem man z.B. den aktuellen Charset ab $0000 legt und im ScreenRAM ein Sprite mit einem aktivierten Pixel über das Zeichen $00 fährt. Der Inhalt von $00 und $01 ergibt sich aus dem Sprite/Char Kollisionsflag im VIC.
Diverse Retro-Computer vorhanden.
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:
DOSferatu hat geschrieben: $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)
[...]
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.
Das ist soweit richtig, vielleicht noch als Ergänzung:
NMI kann man per CIA abschalten.
IRQ kann man per SEI verhindern.
Die RAM Speicherstellen 0 und 1 kann man per VIC auslesen, indem man z.B. den aktuellen Charset ab $0000 legt und im ScreenRAM ein Sprite mit einem aktivierten Pixel über das Zeichen $00 fährt. Der Inhalt von $00 und $01 ergibt sich aus dem Sprite/Char Kollisionsflag im VIC.
Hey, das ist mit dem Sprite ist mir noch unbekannt, oder ich habe es schlicht wieder vergessen.

...

Etwas verwirrend kann es werden, wenn man die Vectoren vom IRQ und vom NMI auf eigene Routinen legt und versucht gleich beide dafür zu nutzen, um etwas darüber zu steuern.
Dabei muss man dann berücksichtigen das der NMI auch einen IRQ unterbrechen kann und ihn quasi überholt. Sehr lang darf eine NMI-Routine aber nicht sein.
Aber um ein zusätzliches Flag zu setzen reicht die Zeit schon, wenn danach zur ursprünglichen Routine weiter gesprungen wird.

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

Re: Commodore 64

Beitrag von oDOSseus »

Falls ich euch eben ganz kurz unterbrechen darf.
Ich war dabei eine Routine zu schreiben die mir einen null-terminierten-String auf dem Bildschirm anzeigt. Das klappt auch. Aber wenn ich diese Routine umbauen will, damit man sie mehrmals verwenden kann fällt mir ein Problem auf: Adressen sind 16bit breit und meine Register nur 8bit... Wie kann ich die Adresse für ein Label, in dem Text steht, an eine Routine übergeben?
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:Falls ich euch eben ganz kurz unterbrechen darf.
Ja gerne.
Ich war dabei eine Routine zu schreiben die mir einen null-terminierten-String auf dem Bildschirm anzeigt. Das klappt auch. Aber wenn ich diese Routine umbauen will, damit man sie mehrmals verwenden kann fällt mir ein Problem auf: Adressen sind 16bit breit und meine Register nur 8bit... Wie kann ich die Adresse für ein Label, in dem Text steht, an eine Routine übergeben?
Man kann die Adresse in die Zeropape schreiben (low byte, high byte) und dann die Routine aufrufen.

Am besten hier:
Adresse
$FB - $FE Freie Bytes in Page 0 für Betriebssystem
http://www.c64-wiki.de/index.php/Zeropage

Ich meine wer kein Kassettenbetrieb hat, der braucht auch kein Kassettenpuffer etc..
So hat man noch sehr viel mehr freien Speicher in der Zeropage.
Da passen sogar ein paar wenige Opcodes rein und eine Hand voll beliebige Parameter/Adressen lassen sich damit auch relativ elegant an eigene Routinen übergeben.

Ggf. kann auch der String selber in die Zeropage verlegt werden an eine fixe Adresse, dann braucht gar keine Adresse mehr übergeben werden, sondern nur der String selber?

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

Re: Commodore 64

Beitrag von oDOSseus »

Und wie kann ich dann mit ihr weiterarbeiten?
LDA ?????, X
was soll ich anstelle der Fragezeichen machen.
Das is ja mein Problem xD.
Danke aber erstmal für die Antwort =)
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:Und wie kann ich dann mit ihr weiterarbeiten?
LDA ?????, X
was soll ich anstelle der Fragezeichen machen.
Das is ja mein Problem xD.
Danke aber erstmal für die Antwort =)
Was man hier braucht ist nicht die Indizierte Adressierung, sondern die Indiziert-Indirekte Adressierung (mit dem X-Register), oder die Indirekt-Indizierte Adressierung (mit dem Y-Register).
Dafür verwendet man zwei Zeropage-Adressen in der man eine Adresse hinein schreibt auf die zugegriffen werden soll.
Beispielsweise ab der Adresse $1000 befinden sich ein paar Bytes auf die wir zugreifen möchten.
Dafür schreiben wir diese Adresse nach FE und FF und können dann z.B mit der Indirekten Y-Indizierten Adressierung auf den Inhalt der dortigen Adresse zugreifen.

Code: Alles auswählen

$00FE  ??
$00FF  ??
.....
$1000  $31, $32, $33, $34, $35, $36, ...

     LDA #$00
     STA $FE
     LDA #$10
     STA $FF
     LDY #$00
     SEC
P1   LDA ($FE),Y
     CMP #$33 
     BEQ P2
     INY
     CPY #$06
     BNE P1
     CLC
P2   ...
http://de.wikipedia.org/wiki/Zeropage
http://www2.informatik.hu-berlin.de/~ku ... 64cpu.html

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

Re: Commodore 64

Beitrag von oDOSseus »

AHA!!!
*ganz laut klick*
dafür muss die Adresse aber zwangsläufig in der Zero-Page abgelegt sein oder?
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:AHA!!!
*ganz laut klick*
dafür muss die Adresse aber zwangsläufig in der Zero-Page abgelegt sein oder?
Ja das muss sie.

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

Re: Commodore 64

Beitrag von oDOSseus »

Sorry. Aber ich komme echt schelcht mit 16bit adressen und 8bit registern klar xD
das schreiben klappt ja. aber wie bekomme ich die adresse vom string in die zero-page wenn ich nur das label kenne?
z.B. :

Code: Alles auswählen

TEXT  !text "C=64 rules"
      !byte $00
davon die adresse würde ich doch mit

Code: Alles auswählen

!word TEXT
bekommen. Oder geht das auch anders?
wenn nein:
Wie bekomm ich das word in die zero-page an die stelle $FE-$FF?
Antworten