Erstellt: 5. Januar 2014 (zuletzt geändert: 1. Januar 2018)

Vom CBM prg Studio zum C64 Studio

Was muss man bei der Umstellung beachten?

CBM prg StudioC64 Studio

Da ich nun endgültig zum C64 Studio gewechselt habe, möchte ich hier kurz auf die wichtigsten Unterschiede zwischen dem CBM prg Studio und dem C64 Studio eingehen.

Dass sich die Editoren für Sprites, Zeichensätze usw. unterschiedlich bedienen lassen, sollte klar sein. Ein Problem stellt dagegen evtl. die Übertragung der Daten von der einen zur anderen IDE dar.

Sprites übertragen

Beide Programme bieten die Möglichkeit Sprites als Binär-Datei zu speichern und zu importieren. Daher lassen sich diese relativ einfach austauschen.

Im CBM prg Studio die Sprites einfach als Binär-Datei speichern:

Binär-Export
Binär-Export

Dann im C64 Studio ein neues Sprite-Projekt erstellen und die eben erzeugte Binär-Datei importieren.

Mit 'From File...' den Import starten
Unter Project mit ‚From File…‘ den Import starten

Nun noch ggf. die notwendigen Anpassungen (Multicolor, Farben) vornehmen

Oben: Direkt nach der Konvertierung Unten: Multi-Color und Farben wurden angepasst
Oben: Direkt nach der Konvertierung
Unten: Multi-Color und Farben wurden angepasst

schon hat man die Sprites übertragen.

Screens übertragen

Eigentlich ließen sich Screens so einfach wie Sprites austauschen. Aber leider hakt es aktuell etwas. Das CBM prg Studio bietet nämlich keine Möglichkeit die Daten als Binär-Datei zuspeichern. Aber es kann eine Binär-Datei importieren, falls ihr z. B. einen Screen vom C64 Studio zum CBM prg Studio übertragen möchtet.
Für den Export als Binär-Datei könnt ihr alternativ im CBM prg Studio ein leeres Projekt erstellen, nur den Screen laden und das „Programm“ erstellen. Dann müsst ihr evtl. noch die Ladeadresse, z. B. mit einem Hexeditor, entfernen!
Das C64 Studio kann dagegen nur binär exportieren und aktuell keine Screens als Binär-Datei importieren!

Daher bleibt hier aktuell wohl nur der manuelle Weg.

Für den evtl. zugehörigen Zeichensatz müsst ihr natürlich noch mit dem nächsten Schritt sorgen.

Zeichensätze austauschen

Ich habe die Zeichensatz-Editoren zwar bisher in keinem Beitrag verwendet, aber die Daten lassen sich wieder, wie die Sprites, über eine Binär-Datei ganz einfach übertragen.

Ihr könnt natürlich auch das CBM prg Studio verwenden um z. B. eure Sprites zu erzeugen, ohne die Daten ins C64 Studio-Format zu übertragen. Speichert die Daten als bin-Datei und bindet diese dann direkt in den Source ein. Dass klappt natürlich auch umgekehrt. Genau so müsstet ihr verfahren, wenn ihr einen externen Editor für Sprites, Zeichensätze oder Screens verwendet.

Der Assembler

Die gravierensten und bei einer Umstellung fehleranfälligsten Unterschiede finden sich beim Assembler.

Ich denke am Besten lassen sich die Unterschiede mit einem kleinen Programm aufzeigen. Da ich hier bisher das CBM prg Studio verwendet habe, zeige ich ein kleines Assemblerprogramm, dass damit erstellt wurde und dann, was bei der Umstellung aufs C64 Studio beachtet werden muss. Beachtet bitte, dass nicht alles im Source sinvoll ist, einiges dient nur dazu Unterschiede aufzuzeigen!

CBM prg Studio

;Beispiel um die Umstellung zum C64 Studio zu erklären.

Operator Calc

DODEBUG = 1
TESTADR = $0400

*=$0801
 BYTE $0B,$08,$DD,$07,$9E,$20,$32,$30,$36,$32,$00,$00,$00

IFDEF DODEBUG
 lda #'x'
 sta TESTADR+$230
 ldx #$00
@loop:
 lda TXT1:,X
 beq @exit:
 sta TESTADR+$2A8,X
 lda TXT2:,X
 sta TESTADR+720,X
 inx
 bne @loop:
@exit:

ENDIF

main:
 ldy #$00
@loop:
 lda #>TESTADR+$100
 tya
 sta TESTADR,Y
 iny
 inc $D020
 jmp @loop:

 incasm "Test.asm"

align 64
 incbin "Test.spt",1,8,true

TXT1:
 TEXT "hallo"
 BYTE $00

txt2:
 TEXT 'welt!'
 BYTE $00

wd1:
 WORD $0000

Möchtet ihr dass Programm erstellen, dann kommentiert bitte die beiden Zeilen mit incasm und incbin einfach aus. Diese dienen nur der Veranschaulichung der Unterschiede und haben auf die Funktionsweise (wie auch einige andere Anweisungen) keinen Einfluss.

So sieht die Ausgabe unseres Testprogrammes aus.
So sieht die Ausgabe unseres Testprogrammes aus.

Und nun zu den Unterschieden. Ihr solltet vorher die Hilfe des C64 Studios und dort besonders den Abschnitt über die Macros studiert haben. Gehen wir einfach schrittweise durch das Programm.

;Beispiel um die Umstellung zum C64 Studio zu erklären.

Juhuu, der Kommentar macht kein Problem. Die Kommentare werden bei beiden gleich behandelt. 😉

Operator Calc

Dies wird beim C64 Studio nicht benötigt. Das < und > zum Ermitteln des LSB und MSB stellt dort einen Operator mit eigener Wichtung dar, wie z. B. + – * /, daher gibt es kein Umschalten, wie beim CBM prg Studio. Also weg mit der Zeile. Genauere Infos gibt es weiter unten, sobald ein solcher Befehl auftaucht.

!to "test.prg",cbm

Dem Assembler des C64 Studios sollte man mitteilen, wie die Ausgabedatei heißt und wo und wie sie gespeichert werden soll. Dies geschieht mit !to, gefolgt vom Pfad inkl. Zielnamen in Anführungszeichen. Abschließend wird noch hinter dem Komma festgelegt, wie das fertige Programm gespeichert werden soll. Mit ,cbm weisen wir den Assembler an die Ladeadresse an den Anfang der Datei zu schreiben (also im bekannten Commodore Business Machines-Format zu speichern). Durch die Angabe von ,plain würde z. B. keine Ladeadresse am Anfang der Zieldatei gespeichert werden.
Ihr könnt aber auch auf !to verzichten, ich mache dies bei den Tutorials ebenfalls, dann nehmen das C64 Studio und ACME den Namen der Quelldatei und speichern diese im aktuellen Verzeichnis.

DODEBUG = 1
TESTADR = $0400

*=$0801

Dieser Abschnitt ist wieder bei beiden identisch.

 BYTE $0B,$08,$DD,$07,$9E,$20,$32,$30,$36,$32,$00,$00,$00

Wie ihr beim !to gesehen habt, beginnen die Assemblerdirektiven beim C64 Studio mit einem Ausrufezeichen !, daher muss es statt BYTE jetzt !byte lauten. Hin und wieder gibt es mehrere (oft kürzere) Schreibweisen. Man könnte hier auch !by, !08 oder einfach nur !8 schreiben. Schaut dazu einfach mal in die Hilfe. Daher muss die nächste Zeile nun

 !byte $0B,$08,$DD,$07,$9E,$20,$32,$30,$36,$32,$00,$00,$00

lauten.

Auch IFDEF DODEBUG und das dazugehörige ENDIF versteht das C64 Studio so nicht. Zunächst muss wieder ein Ausrufezeichen verwendet werden, außerdem muss der dazugehörige Block in geschweifte Klammern (wie unter C) eingeschlossen werden. Dabei ist es wichtig, dass die offene Klammer in der selben Zeile, also direkt hinter der Bedingung, steht.

!ifdef DODEBUG {

Eine nette Fehlerquelle ist die folgende Anweisung lda #‘x‘! Das CBM prg Studio erlaubt es so (durch einfache ) den Screencode für das x in den Akku zu holen. Mit lda „x“ könntet ihr den PETSCII-Code in den Akku laden, beachtet die doppelten .
Hier kommt es nun zu einem Problem: Das C64 Studio kennt diese Unterscheidung zwischen und nicht. Ihr dürft dort nur die doppelten Anführungszeichen verwenden!

Wollen wir also den Screencode für das x in den Akku laden, dann müssen wir beim C64 Studio etwas tricksen, indem wir einfach die folgende Zeile verwenden:

 lda #"x"-"a"+1

Wir berechnen hier den Screencode einfach, indem wir vom PETSCII-Code fürs x (120) den fürs a (97) abziehen und eins hinzuzählen. Somit kommen wir auf 24, was bei einem Blick ins Char-ROM dem X entspricht.
Kleiner Exkurs: Diese Zeile ließe sich für den häufigen Gebrauch z. B. mit einen eigenen Macro vereinfachen.

!macro ldasrc petscii
  lda #petscii-"a"+1
!end

Dann könntet ihr lda #“x“-„a“+1 einfach durch +ldasrc „x“ ersetzen. Beachtet das +, damit wird der Aufruf eines eigenen Macros eingeleitet! Bei Ziffern dürft ihr nicht so vorgehen, diese liegen im PETSCII und Char-ROM an der selben Stelle!

 sta TESTADR+$230
 ldx #$00
@loop:
 lda TXT1:,X
 beq @exit:
 sta TESTADR+$2A8,X

Dieser Block funktioniert anscheinend (s. u.) bei beiden IDEs.

Die nächste Anweisung lda TXT2:,X macht dann aber wieder Probleme. Das C64 Studio ist casesensitiv, d. h. es unterscheidet (zumindest teilweise) zwischen Groß- & Kleinschreibung! Interessant ist, dass bei den vorgegebenen Assemblerdirektiven keine Unterscheidung stattfindet, ihr könnt also sowohl !to als auch !TO schreiben.

Wir müssen aber bei unserem Label txt2: auf die Großschreibung achten und daher

 lda txt2:,X

verwenden.

 

Da der Rest wieder identisch ist, hier nochmal der komplette !ifdef-Block.

!IFDEF DODEBUG {
 +ldasrc "x"
 sta TESTADR+$230
 ldx #$00
@loop:
 lda TXT1:,X
 beq @exit:
 sta TESTADR+$2A8,X
 lda txt2:,X
 sta TESTADR+720,X
 inx
 bne @loop:
@exit:
}

main:
 ldy #$00
@loop:

Das bne *-9 könntet ihr, wie eben erwähnt, durch ein bne – ersetzen. Dann müsste natürlich auch vor lda txt2:,X ein stehen.

Da main:, ldy #$00 und @loop: wieder bei beiden zu funktionieren scheinen, habe ich diese hier gleich mit angegeben.

Nun zum lda #>TESTADR+$100. Wie Benutzer des CBM prg Studios aus leidvoller Erfahrung wissen, wird dort über einen Schalter (oder mit der in diesem Beispiel verwendeten Assemblerdirektive Operator Calc) bestimmt, ob hier erst das MSB der Adresse ermittelt und dann addiert wird, oder ob erst der angegebene Wert auf die Adresse addiert und anschließend das MSB ermittelt wird. Durch die verwendete Direktive Operator Calc wollen wir erst addieren.

Beim C64 Studio sind < und > allerdings ganz normale Operatoren. Diese haben eine höhere Priorität als + – * /. Somit führt ein lda #>TESTADR+$100 immer dazu, dass erst das MSB gebildet und dann der Wert addiert wird. Um erst zu addieren, müssen wir also nur Klammern verwenden.

 lda #>(TESTADR+$100)

Der Rest istdann wieder identisch.

 tya
 sta TESTADR,Y
 iny
 inc $D020
 jmp @loop:

Das Einbinden von Dateien funktioniert auch etwas anders. Statt incasm „Test.asm“ verwendet das C64 Studio diese Anweisung:

 !source "Test.asm"

um einen Quellcode hinzuzuladen.


Auch ein align 64 lehnt das C64 Studio ab. Hier ist die Anweisung etwas komplexer, aber damit auch flexibler. Sie lautet !align UND-Wert, Vergleichswert [, Füllwert]. Umgangssprachlich „sagen“ wir also: Fülle den Speicher solange mit dem angegebenen Füllwert (0 falls nichts angegeben wurde), bis Programcounter AND UND-Wert gleich dem Vergleichswert ist.

Wir schreiben also einfach:

!align 63,0

Statt mit incbin „Test.spt“,1,8,true, lassen sich Sprites und andere Projektdaten über !media einbinden. Hier mit könnt ihr Sprites, Zeichensätze, Textbildschirme und Bitmaps direkt einbinden. Werft einfach mal einen Blick in die Hilfe des C64 Studios.
Hier verwenden wir jetzt:

!media "Test.spriteproject",sprite,1,8

Dies setzt selbstverständlich voraus, dass „Test.spriteproject“ ein C64 Studio Spriteprojekt ist.

TXT1:
 TEXT "hallo"
 BYTE $00

Dies bedarf zweier Änderungen. Dass es statt TEXT nun !text lauten muss, wird keinen mehr überraschen. Dass wir den Text in Großbuchstaben angeben müssen, mag dann schon etwas unerwartet sein. Beide Fassungen liefern hier einen PETSCII-Text. Beim C64 Studio können wir das Byte $00 sogar noch direkt hinter den Text schreiben…

TXT1:
 !text "HALLO", $00

Das CBM prg Studio verhält sich dort etwas merkwürdig. $00 wird als Text mit ausgegeben, falls es mit in der TEXT-Zeile steht.

Beim nächsten TEXT sieht die Sache wieder etwas anders aus:

txt2:
 TEXT 'welt!'
 BYTE $00

Hier erzeugt man beim CBM prg Studio Screencodes. Wie weiter oben bereits erwähnt, findet beim C64 Studio keine besondere Unterscheidung zwischen und statt. Um dort ebenfalls Screencodes zu erhalten, müssen wir dem Assembler mitteilen, dass er eine Konvertierung durchführen soll. Das geschieht mit !convtab. Dieses erwartet als Parameter, wie gemappt werden soll. Man kann ein eigenes Mapping übergeben oder mit raw und scr auf die vorgegebenen zurückgreifen. Wir brauchen hier scr um Screencodes zu erhalten. Ihr könnt allerdings auch direkt !scr nehmen, das etwas kürzer ist. Außerdem müssen wir wieder an die doppelten Anführungszeichen denken.

txt2:
 !scr "welt!", $00

Falls ihr !convtab verwendet, beachtet dass es seine Gültigkeit für alle folgenden !text-Anweisungen behält, nicht nur für die direkt folgende! Ein !scr wirkt sich natürlich nur auf die aktuelle Zeile aus.


Beim Label wd1: wird aus WORD einfach !word.

wd1:
 !word $0000

Nun sind wir auch schon fertig. Sobald ihr das Programm erstellt und startet, solltet ihr die weiter oben gezeigte Ausgabe erhalten.

 

Ich möchte noch eine weitere Möglichkeit für „einfache“ Label zeigen.

bne +
...
beq ++
...
++ ;von beq
...
+  ;von bne
...
bmi +
...
...
+  ;vom bmi

Mit bne + springt ihr immer vorwärts zum nächsten +-Label, ihr müsst euch so keine umständlichen Namen ausdenken. Man kann die Kette auch erweitern, wie ihr am ++ erkennen könnt. Das gleiche Spiel, nur umgekehrt, klappt auch mit , dann wird immer rückwärts zum nächsten gesprungen.

Also ersetzen wir hier die beiden @exit: einfach durch ein +.

beq +
...
+

 

 

Hier nochmal das komplette Programm in der C64 Studio-Fassung…

C64 Studio

;Beispiel um die Umstellung zum C64 Studio zu erklären.

!macro ldasrc petscii {
 lda #petscii-"a"+1
}

DODEBUG = 1
TESTADR = $0400

*=$0801
 !byte $0B,$08,$DD,$07,$9E,$20,$32,$30,$36,$32,$00,$00,$00

!IFDEF DODEBUG {
 +ldasrc "x"
 sta TESTADR+$230
 ldx #$00
@loop:
 lda TXT1:,X
 beq @exit
 sta TESTADR+$2A8,X
 lda txt2:,X
 sta TESTADR+720,X
 inx
 bne @loop:
@exit:
}

main:
 ldy #$00
@loop:
 lda #>(TESTADR+$100)
 tya
 sta TESTADR,Y
 iny
 inc $D020
 jmp @loop:

; !source "Test.asm"

!align 63,0
; !media "Test.spriteproject",sprite,1,8

TXT1:
 !text "HALLO", $00

txt2:
 !scr "welt!", $00

wd1:
 !word $0000

Auch wenn das C64 Studio keine Probleme damit hat, würde ich dazu raten, mit den Doppelpunkten bei Labeln sparsam zu sein. ACME kommt z. B. mit einem lda TXT1:,X nicht klar! Erst wenn ihr den Doppelpunkt wegnehmt, klappt die Programmerstellung. Bei Sprüngen bne @loop: stört sich ACME aber nicht am Doppelpunkt. Ich verzichte daher normalerweise auf Doppelpunkte.

Den Einen oder Anderen mag dies nun abschrecken, aber so wild sind die Unterschiede auch wieder nicht. Insgesamt bietet der Assembler des C64 Studios viel mehr Möglichkeiten, als der vom CBM prg Studio.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (3 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


Zurück

2 Gedanken zu „Vom CBM prg Studio zum C64 Studio“

  1. Hallo,

    erstmal Danke für das ausführliche Tutorial! Sehr gut verständlich erklärt alles, auch wenn wirklich viele “Typos” vorzufinden sind. Good job!

    Mir ist im abschliessenden Listing allerdings diese Zeile aufgefallen:
    lda #>TESTADR+$100
    Sollte diese nicht folgendermassen lauten?:
    lda #>(TESTADR+$100)

    Ich habe das Listing nicht compiled, da ich das hier erlernte Wissen lieber direkt in ein eigenes Projekt einfliessen lasse! 😉 Von daher kann ich jetzt nicht sagen ob ich hier richtig oder falsch liege.

    Grüsse!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Protected by WP Anti Spam