Posts by Mac Bacon

    ich wollte das mit einem Parameterfile machen und auch mitloggen.

    nachdem aber nur eine begr. Anzahl an Files offen sein darf muss ich halt vor dem File schliessen, wo ich weitermachen muss.

    Für ein Logfile könnte man den Append-Modus benutzen, der hat aber auch einige Probleme:

    1. Man kann nur an bereits bestehende Dateien anhängen, das erste Öffnen muss also im regulären Write-Modus erfolgen.

    2. Je länger das Logfile schon ist, desto länger dauert das erneute Öffnen im Append-Modus, aus genau dem eingangs erwähnten Grund: Das 1541-DOS kennt kein Seek und muss immer die komplette Datei überlesen, um ans Ende zu gelangen.

    3. Durch einen Bug im DOS wird bei jedem Öffnen im Append-Modus die Blockzahl im Directory hochgezählt, selbst wenn gar kein neuer Block angefangen wurde.

    Es geht mir auch nicht um Optimierung, sondern um Kompatibilität. Der Code soll halt auf mehreren Plattformen kompilierbar sein (C64 / Atari / Amiga / PC /...)

    Das wird schwierig. Nur ein Bespiel: Auf anderen Systemen kann man bestehende Dateien durch Öffnen im Write-Modus einfach überschreiben; die 1541 beschwert sich in so einem Fall aber mit "File exists". Bei Dateihandling kommt man daher um systemspezifischen Code nicht herum.

    Mir gehen beim CC65 einige Standard-Funktionen ab.

    fgetpos; fsetpos,...

    [...]

    habt ihr da einen Lösungsansatz?

    Ja: Ohne diese Funktionen auskommen. Selbst wenn cc65 diese Funktionen bereitstellen würde, so wären sie geradezu unglaublich langsam, denn schließlich kann das Standard-Commodore-DOS in der 1541 kein "seek", d.h. man erreicht die Funktionalität nur durch "Datei schließen, dann neu öffnen und x Bytes überlesen".

    Die einzige Ausnahme ist der P-Befehl für REL-Files, aber die bringen dafür andere Probleme mit sich.


    Was genau versuchst Du denn zu erreichen?

    I don't know about C65/M65, but on the C128 this would fail because you first select BANK 0 but then try to call a kernal function (but the kernal is banked out). Use a bank where the kernal is active, or activate it yourself at the start of your routine.

    As the kernal stub only jumps to $02cd (again, this is the C128 value), one might try to directly jump there instead, without need for the kernal. Unfortunately, on a C128 even that would fail, because the routine at $02cd calls another kernal function to convert the desired bank number to the value for the mmu configuration register.

    In the end it is much easier to just ignore JMPFAR/JSRFAR and write your own functions. JMPFAR/JSRFAR are only really useful for implementing the SYS instruction of Basic.

    Gibt es dazu eine Erklärung, warum das so ist? Ich würde es gerne verstehen wollen.

    Need more info.

    Dann ging der eigene Charset nicht mehr...

    War einfach ein Datenmüll-Charset aktiv? Oder ist das Programm abgeschmiert? Bei Fehlern mit $01-Banking kann es sein, dass man Daten in die I/O-Chips statt in das RAM "unter" den I/O-Chips kopiert.


    Oder es liegt an der Position der Kopierschleife im Programm: Hast Du den ganzen Code-Teil verschoben oder nur ein JSR verschoben? Gerade bei sehr obskurem Fehlverhalten kann man so einen Bug "beheben", obwohl man ihn in Wirklichkeit nur verschleiert hat...

    ich sehe zum ersten Mal den MID$-Befehl auf der linken Seite einer Zuweisung. Wenn es das tut was ich denke (einen Teil des Strings mit einem neuen Inhalt überschreiben), wäre das etwas, was ich in anderen Basicvarianten vermisse.

    Ähhh... sogar Commodore Basic kann das ab Version 3.5

    C zeigt das Ergebnis für unsigned-Vergleiche, N zeigt das Ergebnis für signed-Vergleiche.

    Stimmt nicht! Das konnte ich jetzt schon irgendwo lesen. Denn:


    $7F (127) - $80 (>-128) = $FF (N=1)

    $01 (1) - $FF (>-1) = $02 (N=0)

    Ja. Kurz gesagt: Das N-Flag enthält einfach das Vorzeichen des Ergebnisses (also dessen Bit 7), nachdem das Ergebnis auf acht Bits zurechtgestutzt wurde.

    Oder anders ausgedrückt: Wenn man das Register mit dem Argument vergleicht, dann ist danach N genau dann gesetzt, wenn das Argument einer der 128 Werte ist, die auf den Registerwert folgen. Ist das Argument aber der Registerwert selbst, oder einer der 127 Vorgängerwerte, dann wird N gelöscht.


    Wenn man sich das Verhalten der Flags tabellarisch darstellt, dann bildet N einen diagonalen Streifen, während C ein Dreieck inklusive der Hauptdiagonale belegt.

    bevor es mit RUN gestartet wird.

    Mit Basic ist da nichts

    Zuerst waren es "alle Programme, die man mit RUN starten kann". Mit RUN startet man Basicprogramme. Wenn Du Dich dabei auf solche Basicprogramme beschränken willst, die nur aus SYS2061 und Maschinenspracheteil bestehen, dann kannst Du auf die Initialisierung von 2d/2e in der Tat verzichten. Später wird Dir natürlich unweigerlich ein obskures Programm über den Weg laufen, welches sich aus unerfindlichen Gründen darauf verlässt, dass 2d/2e korrekt initiaisiert ist, und dann fängt die Suche nach dem Bug an.

    Rechner ist eingefroren, komme mit Run/Stop Restore nicht raus.

    Mit Vice funktioniert leider der Space-Reset bzw. Commodore-Reset mit Speed Dos Plus nicht

    Mit dem VICE-Monitor kannst Du doch sofort herausfinden, was die CPU gerade macht!?

    Also individuell für alle Programme, die man mit RUN starten kann.

    LDA #03 Muss 2D/2E
    STA 2D zwingend gesetzt werden ?
    LDA #08 Ich will ja kein Basicprogramm starten

    Entscheide Dich. :D

    Wenn 2d/2e nicht auf das Ende des Programms zeigt, überschreibt die erste Variablenzuweisung im Basic das Programm selbst.


    AB1E ist die Routine für String-Output. Sieh Dir mal an, welcher String da ausgegeben wird.


    Die Verzögerung dient möglicherweise dazu, einen automatischen Diskzugriff erst dann zu machen, wenn die 1541 bereit ist.

    Allerdings funktioniert die Routine bei mir nicht und ich weiß nicht warum.

    Was genau passiert denn?

    Regardless of who does the porting work, I strongly concur with ubik that the starting point should be BASIC IV, as provided here: BBC BASIC IV source on Github.

    Thank you very much for the link to the repository. I cloned the repo and created a branch called "acmesyntax", where I converted the source codes to ACME format. I had to make some assumptions concerning the original MASM syntax, but now the source can be assembled using ACME and the resulting binary is identical.

    See my signature for a link to my github page. If someone wants to continue with this version, remember you have to select the correct branch to see the new files.

    Nach Austausch der beiden Bezeichnungen stimmt es aber.

    Ob ein Gerät nun "DTE" oder "DCE" oder Hans oder Fritz heißt, ist mir ziemlich wumpe. :D In meiner Privatdoku steht einfach nur dies:

    Eine RS232-Schnittstelle mit weiblichem DE9-Verbinder sendet auf Pin 2.

    Eine RS232-Schnittstelle mit männlichem DE9-Verbinder sendet auf Pin 3.