C64 Studio - Entwicklungsumgebung

  • Hallo zusammen,

    wenn ich einen Zeichensatz (charset.projectfile) in den Text Screen Editor importieren möchte, quittiert das C64 Studio mit einer Fehlermeldung.

    Spoiler anzeigen

    System.InvalidOperationException: Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.
    bei System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()
    bei System.Windows.Forms.Application.ExitInternal()
    bei System.Windows.Forms.Application.ThreadContext.OnThreadException(Exception t)
    bei System.Windows.Forms.Control.WndProcException(Exception e)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnThreadException(Exception e)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.Run(Form mainForm)
    bei C64Studio.Program.Main(String[] args)


    Ein paar Bilder zum besseren Verständnis findet ihr weiter unten. Kann das Problem jemand bestätigen? (Hab gestern auf das Fall Creators Update aktualisiert - nicht das es daher rührt.)
    Bilder
    • Screenshot2.jpg

      59,22 kB, 1.031×614, 11 mal angesehen
    • Screenshot1.jpg

      65,02 kB, 1.024×730, 12 mal angesehen
    • Screenshot3.jpg

      72,43 kB, 916×710, 12 mal angesehen
    Wer schreit, denkt nicht !

    www.dmhas.de / nas.dmhas.de/
  • KiWi hat gerade angefragt, ob ich mein C64-Diag-Projekt nicht in 64Studio weiterführen kann.

    Dazu eine Frage zu C64Studio. Ich verwende mit meinem Compiler in fast allen meinen Projekten lokale Labels. Das sind Labels, mit dem Präfix "_", die innerhalb von PROC/ENDPROC Gültigkeit haben.
    ACME kennt dafür routine_start/routine_end. Die lokalen Labels beginnen hier mit einem Punkt.

    Unterstützt der C64Studio Assembler so einen Mechanismus für lokale Labels?
    PET 2001 / CBM 3032 / CBM 3040+4040 / CBM 8250 (Dauerleihgabe) / C64+1541 / VC20

  • @detlef:
    Die .-Syntax für lokale Labels kann C64Studio, genau wie ACME.
    Die lokalen Labels gelten immer im Anschluss an ein !zone-Element.

    Welchen Assembler hast du denn da verwendet? C64Studio unterstützt teilweise auch andere Assembler-Syntaxen (ACME zu einem sehr großen Teil, DASM und PDS zu kleineren Teilen und CBMPRGSTUDIO sowie C64ASM zu kleinen). Ggf. kann ich das auch einbauen.

    @DMHas: Ah, danke für den Hinweis. Kann ich nachstellen. Ich übersehe immer wieder, dass nicht jeder mit einem Projekt arbeitet. Wird gefixt!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Endurion ()

  • detlef schrieb:

    lokale Labels. Das sind Labels, mit dem Präfix "_", die innerhalb von PROC/ENDPROC Gültigkeit haben.
    ACME kennt dafür routine_start/routine_end.
    Warum weiß ich dann nix davon? Menno, nie erzählt mir hier einer was. :P

    ...in ACME muss der Gültigkeitsbereich der lokalen Symbole immer manuell per "!zone" abgesteckt werden. Die einzige Ausnahme sind Makros, dort bekommt jeder Aufruf automatisch eine eigene Zone.

    Schon seit geraumer Zeit steht die Einführung von "Cheap Locals" auf der TODO-Liste, deren Bereich würde automatisch durch die umliegenden globalen Labels abgesteckt. Die Implementation ginge sogar recht fix, das ist bisher immer nur an einer Sache gescheitert: Da ich selbst statt lokaler Labels inzwischen fast nur noch anonyme Labels benutze, ist der Leidensdruck nicht sonderlich hoch...
    Yes, I'm the guy responsible for the ACME cross assembler
  • Endurion schrieb:

    Die lokalen Labels gelten immer im Anschluss an ein !zone-Element.
    Wie sieht das aus? Kannst du mal ein kurzes Beispiel posten?

    EDIT: Ich hab's gerade gefunden. Das scheint mir aber von der Verwendung her eher eine Art Namespace-Ersatz zu sein.
    Bei mir sieht das so aus:

    Quellcode

    1. DELAY PROC
    2. TXA
    3. PHA
    4. LDX #0
    5. _LOOP1: INX
    6. BNE _LOOP1
    7. _LOOP2: INX
    8. BNE _LOOP2
    9. PLA
    10. TAX
    11. RTS
    12. ENDPROC
    Alles anzeigen
    DELAY ist der Einsprungspunkt. Alles andere ist hier lokal. Da springt mir keiner mal eben mitten rein und wenn, dann sieht man das am globalen Label.
    Ich verstehe gar nicht, wie ihr größere Projekte nur mit globalen Labels schreiben könnt.


    Endurion schrieb:

    Welchen Assembler hast du denn da verwendet? C64Studio unterstützt teilweise auch andere Assembler-Syntaxen (ACME zu einem sehr großen Teil, DASM und PDS zu kleineren Teilen und CBMPRGSTUDIO sowie C64ASM zu kleinen). Ggf. kann ich das auch einbauen.
    Das ist ein eigener. Den hatte ich in den 80ern geschrieben, als ich noch beruflich 6502 programmiert habe und unter DOS keinen brauchbaren Crosscompiler gefunden habe.
    Ich habe den dann vor ein Jahr von C nach C# portiert, damit ich meine alten Sachen wieder assemblieren kann. Außerdem hatte ich diverse Quellen (z.B. das Betriebssystem der PET Floppys, für die ich überhaupt keinen Assembler gefunden habe. Ich habe dann einfach meinen Assembler an die Syntax angepasst.

    Mein Problem ist, dass ich nicht so einfach auf 64Studio wechseln kann. Ich würde daher eher meinen Assembler an die ACME-Syntax anpassen, damit die Quellen kompatibel sind.

    Mac Bacon schrieb:

    Schon seit geraumer Zeit steht die Einführung von "Cheap Locals" auf der TODO-Liste, deren Bereich würde automatisch durch die umliegenden globalen Labels abgesteckt. Die Implementation ginge sogar recht fix, das ist bisher immer nur an einer Sache gescheitert: Da ich selbst statt lokaler Labels inzwischen fast nur noch anonyme Labels benutze, ist der Leidensdruck nicht sonderlich hoch...
    Ich kann mir irgendwie nicht vorstellen, wie das in der Praxis aussieht.
    Anonyme Labels sind für mich keine Lösung. Ich will den Code schon noch lesen können.
    PET 2001 / CBM 3032 / CBM 3040+4040 / CBM 8250 (Dauerleihgabe) / C64+1541 / VC20

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von detlef ()

  • Mac Bacon schrieb:

    Schon seit geraumer Zeit steht die Einführung von "Cheap Locals" auf der TODO-Liste, deren Bereich würde automatisch durch die umliegenden globalen Labels abgesteckt.

    Endurion schrieb:

    Sowas schoss mir auch immer wieder mal durch den Kopf. Man müsste aber auf jeden Fall ein neues Startzeichen dafür aussuchen, damit existierender Code immer noch funktioniert.
    Üblich ist wohl '@'.

    detlef schrieb:

    Ich verstehe gar nicht, wie ihr größere Projekte nur mit globalen Labels schreiben könnt.
    Das hat doch gar keiner behauptet?

    detlef schrieb:

    Ich kann mir irgendwie nicht vorstellen, wie das in der Praxis aussieht.
    Ungefähr so:

    Quellcode

    1. delay ; <-- durch dieses globale Label wird automatisch ein neuer Scope für die "cheap locals" eröffnet
    2. txa
    3. pha
    4. ldx #0
    5. @loop1 inx
    6. bne @loop1
    7. @loop2 inx
    8. bne @loop2
    9. pla
    10. tax
    11. rts
    12. dings ; <-- das globale Label für die nächste Routine eröffnet den neuen Scope
    Alles anzeigen

    detlef schrieb:

    Anonyme Labels sind für mich keine Lösung. Ich will den Code schon noch lesen können.
    Das kommt immer auf den Einzelfall an. Oft genug sind anonyme Labels lesbarer als "loop1/loop2/skip3" etc.
    Yes, I'm the guy responsible for the ACME cross assembler
  • Endurion schrieb:

    Für die !zone-Syntax würde das so aussehen:
    Das sieht ok aus. Mit der Syntax kann ich leben. ;)

    Gibt es irgendein größeres Assembler-Projekt, das mit dem C64Studio erstellt wurde? Damit ich mal schauen kann, wie das alles in der Praxis aussieht und verwendet wird und ich sehen kann, welche Kommandos ich zuerst implementieren muss.

    Ich hänge hier auch mal den aktuellen Quelltext von meinem C64-Diag-Projekt an. Dann können wir vergleichen.
    Dateien
    • c64_diag.zip

      (13,74 kB, 3 mal heruntergeladen, zuletzt: )
    PET 2001 / CBM 3032 / CBM 3040+4040 / CBM 8250 (Dauerleihgabe) / C64+1541 / VC20

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von detlef ()

  • Das Pre-Guns 'n' Ghosts wäre ein größeres Beispiel, wo der Code auch frei verfügbar ist.

    Der Code ist allerdings nicht weltbewegend schön aufgeräumt, alles in einem großen File, etc...
    Habe ich hier mal angehängt (das wird beim Öffnen des .c64-Files einmal direkt ein .s64 speichern wollen, das soll so)
    Dateien
    • step100.zip

      (234,98 kB, 3 mal heruntergeladen, zuletzt: )
  • Endurion schrieb:

    Das Pre-Guns 'n' Ghosts wäre ein größeres Beispiel, wo der Code auch frei verfügbar ist.
    Ok, das sieht von den Pseudo-Opcodes her überschaubar aus. Die geschweiften Klammern widersprechen etwas meiner Logik, aber das kriegt man hin. Die Syntax meines Assemblers ist halt old-school zeilenorientiert.
    Also ich schaue mal, dass ich meinem Assembler die wichtigsten Dinge beibringe und dann baue ich C64-Diag so um, dass es mit C64Studio assembliert.Kann man den C64Studio-Assembler per Komandozeile starten oder muss man dazu ins C64Studio?

    Kennt der C64Studio-Assembler ein System-Label, über das man Abfragen kann, dass mit C64Studio assembliert wird?
    Dann kann ich die Pseudo-Opcodes meines Assemblers per IF-Statement klammern.
    PET 2001 / CBM 3032 / CBM 3040+4040 / CBM 8250 (Dauerleihgabe) / C64+1541 / VC20

  • Es gibt ein Teilprojekt mit Kommandozeilen-Assembler, den ich (*nachkram*) offenbar nie ins Release-Archiv gepackt habe. Das wäre im Projekt der C64Ass.

    Ich mag die geschweiften Klammern auch nicht besonders, aber Mac Bacon steht drauf :)

    Ein System-Label habe ich bisher nicht drin. Gute Idee aber. Setze ich gleich rein. Ich habe das mal in Ermangelung an Vorgaben ASSEMBLER_C64STUDIO genannt und auf Wert 1 gesetzt.
  • Endurion schrieb:

    Ein System-Label habe ich bisher nicht drin. Gute Idee aber. Setze ich gleich rein. Ich habe das mal in Ermangelung an Vorgaben ASSEMBLER_C64STUDIO genannt und auf Wert 1 gesetzt.
    Das ist super. Ich werde dann etwas entsprechendes bei mir einbauen. Mein Assembler hat noch keinen Namen. Der heisst einfach nur Asm65.exe.
    Da muss ich mir noch was Schlaues einfallen lassen. ;)

    Ist es völlig frei, wo die geschweiften Klammern stehen können? Also

    !ifdef TEST {
    }

    oder

    !ifdef TEST
    {
    }

    Spätestens hier wäre mein Parser aufgeschmissen:

    !ifdef TEST { ... }

    Das kann der nicht.
    PET 2001 / CBM 3032 / CBM 3040+4040 / CBM 8250 (Dauerleihgabe) / C64+1541 / VC20

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von detlef ()

  • Die Öffne-Klammern müssen in der gleichen Zeile wie die zugehörige Anweisung sein. Also nur das erstere. Stört mich aber auch schon lange :)

    Das Beispiel ganz zu Ende mit allem in einer Zeile kann C64Studio auch nicht. Ist ja pervers :)


    Bei ein paar Sachen wie Makros habe ich das wahlweise mit Klammern oder einem Ende-Makro.
  • Endurion schrieb:

    Die Öffne-Klammern müssen in der gleichen Zeile wie die zugehörige Anweisung sein. Also nur das erstere. Stört mich aber auch schon lange
    Ok, das ist dann einfacher. :)

    So gerne ich in C und C# die öffnende Klammer auf die nächste Zeile setze, meinen Parser würde das deutlich verkomplizieren, weil der - wie gesagt - zeilenweise arbeitet.
    PET 2001 / CBM 3032 / CBM 3040+4040 / CBM 8250 (Dauerleihgabe) / C64+1541 / VC20