Hallo Besucher, der Thread wurde 21k mal aufgerufen und enthält 169 Antworten

letzter Beitrag von Parser am

COMAL-80 - "Super Chip" Package - eigene Implementierung


  • Neuanfang, weil der Titel nicht mehr passend ist.

  • Sehr gut,:thumbup:

    genau das dachte ich mir auch schon mal.


    Deswegen auch gleich mal eine passende Einleitung von meiner Seite.:)



    Wie ihr alle wisst, gibt es wohl das Superchip EPROM, denoch ist es fuer un sim Moment nicht verfuegbar.

    Aus diesem Grund hatten wir uns ja entschlossen die Kommandos so weit es geht selber zu programmieren, bzw. vorhandene Programmteile aus anderen Quellen zu uebernehmen, und damit unser eigenes Super-Chip-II EPROM zu gestalten.


    Diddl hat ja schon wirklich viel dazu beigetrage, um es zu verwirklichen.

    Mit seinem unermuedlichem Einsatz haben wir fast das komplette Math-Packet nachbilden koennen, und auch andere Pakete wachsen stetig weiter unter seiner Obhut.


    Danke dafuer. :thnks:



    In der Zwischenzeit war ich aber auch nicht untaetig, und habe einiges programmiert, bzw. Source-Codes aus vorhandenen Modulen, und Paketen erstellt.


    Folgende Pakete habe ich aufbereitet:

    . Deutsch

    . C128

    . Matrix

    . Quickload

    . Keyboard

    . System2

    . Cmon


    Cmon ist eine an COMAL angepasste Smon-Plus-Version.

    Und zum Math-Paket habe ich noch HYPOTENUSE und auch DISTANCE mit beigesteuert.:D


    Die Pakete Deutsch, Keyboard, Systam2 und Cmon habe ich mal auf ein d64-Image gepackt.


    Hier eine kleine Uebersicht:

    • deutsch:
      Das Paket linken, und mit ‘use deutsch’ starten.
      Dann stehen wie auch schon im Hagensoft-Modul, die deutschen Fehlermeldungen zur Verfuegung.
    • keyboard:
      Das Paket linken, und mit ‘use keyboard’ starten.
      Befehle dazu:
      • repeatkeys(a)
        schaltet die Tastenwiederholfunktion ein, bzw. aus
      • clearkeys
        loescht den Tastaturpuffer
      • fillkeys(a$)
        fuellt den Tastaturpuffer mit dem angegebenen String
        Es sind bis zu 10 Zeichen moeglich
      • enable’keyboard
        setzt die Anzahl der moeglichen einzugebenden Zeiche auf 10, somit sind Tastatureingaben wieder moeglich.
      • disable’keyboard
        setzt die Anzahl der moeglichen einzugebenden Zeichen auf 0, somit sind keine Tastatureingaben mehr moeglich.
        Im Direkmodus wird diese Funktion nicht unterstuetzt.
      • lock’lowercase
        schaltet auf Kleinschreibung um.
      • lock’upercase
        schaltet auf Grosschreibung um.
      • shift
        mit PRINT shift kann man feststellen, ob die Shifttaste gedrueckt ist.
        Damit kann man z.B in einem Programm mit ‘WHILE NOT shift DO’ auf das druecken der Shift-Taste warten.
      • version’keyboard$
        mit Print version’keyboard$ wird die Version des Pakets angezeigt.
    • system2:
      Das Paket linken, und mit ‘use system2’ starten.
      Befehle dazu:


      • current'page
        Mit ‘PRINT current’page’ wird die aktuelle PAGE angezeigt.
        PAGE ist hierbei der momentan von COMAL aktivierte Bereich im EPROM.
      • Host
        Mir ‘PRINT host’ wird entweder “c64”, oder “C128” angezeigt, je nachdem auf welchem Commodre Rechner COMAL gerade laeuft.
        Das kann z.B. dazu genutzt warden, um festzustellen, ob der VDC-Ram zur Verfuegung steht.
      • Hidescreen
        Die Eingabe von ‘hidescreen’ schaltet den Bildschirm aus
      • showscreen
        Die Eingabe von showscreen’ schaltet den Bildschirm an
    • cmon
      Das Paket linken, und mit ‘use monitor’ starten.
      Danach kann man den Cmon mit ‘cmon’ aufrufen.
      Im cmon stehen fast alle Befehle, welche auch im SMON in der PLUS-Version verfuegbar sind zur Verfuegung.


    In der finale Version von Super-Chip-II werden alle Pakete integriert sein.

    Zusaetzlich zu den schon in der Excel-Tabelle angegebenen Paketen, werden noch die folgenden Pakete enthalten sein:


    . Matrix

    . Quickload (statt RABBIT, das ist der jetzige Status, kann sich eventuell noch aendern.)

    . Cmon


    Es gibt zudem noch andere Pakete, welche ich mir noch nicht richtig angeschaut habe. Eventuell ist da noch was interresantes dabei.

    Soweit erst mal der Status von meiner Seite.



    wie schon so oft, mfG aus dem fernen China

    Claus

  • In dem Package FILES gibt es die Befehle BSAVE und BLOAD.

    Ich kann diese Befehle relativ simple implementieren, aber ich frag mich, was hat man damit wirklich gemacht??



    Wo ich für BSAVE() noch halbwegs Sinn erkennen kann, frage ich mich ob BLOAD() nicht einfach nur gefährlich ist.


    BLOAD() lädt eine Datei an die Adresse, die von den ersten beiden Bytes in der Datei vorgegeben wird.

    Das hat zur Folge, dass die meisten Dateien die Stabilität des System gefährden.


    Wohin kann man Dateien laden, ohne dass es gleich gefährlich wird??


    Mir fallen da nur Arbeits Regionen ein die garantiert gerade unbenutzt sind:

    • Bildschirm RAM (CAHR)
    • Bildschirm Color RAM
    • Bildschirm Hires RAM
    • Sprite Buffer
    • Kassetten Buffer
    • RS232 In/Out Buffer


    Alles andere ist fraglich, weil man nicht weiß, wie COMAL den Bereich gerade benutzt.


    In jedem Fall wäre es gut, wenn man Dateien auch an eine bestimmte Adresse laden kann:


    BLOAD(filname$, Address)


    ===


    Beim BSAVE() ist es weniger gefährlich.

    Da kann nicht soviel passieren.


    Die Frage ist halt, was genau speichert man denn in die Datei?

    • im Bereich $E000-$FFFF erwischt man immer das Kernal ROM (weil da die IEC Routinen sind die BSAVE braucht)
    • im Bereich $D000-$DFFF erwischt man immer die IO Page (weil da die IO Ports sind die BSAVE braucht)
    • im Bereich $C000-$CFFF sind die meisten Bereiche belegt und uninteressant bis auf $C000 bis $C1FF
    • im Bereich $8000-$BFFF kann man C64 RAM haben oder Cartridge ROM oder BASIC ROM
    • im Bereich $0000-$7FFF ist RAM und BSAVE mag durchaus Sinn ergeben


    Jedenfalls vermisse ich Parameter oder einen weiteren Befehl, mit dem ich bestimmen kann, was BSAVE denn genau sieht im Bereich $8000 - $BFFF.


    Schön wäre auch, wenn ich den gesamten 64K RAM Bereich mit BSAVE speichern könnte.

    Aber dann wird es erstens viel komplizierter und es wird viel langsamer.

    Also werde ich auf dieses Feature vorerst verzichten.

  • Diddl hat ja schon wirklich viel dazu beigetrage, um es zu verwirklichen.

    Mit seinem unermuedlichem Einsatz haben wir fast das komplette Math-Packet nachbilden koennen, und auch andere Pakete wachsen stetig weiter unter seiner Obhut.


    Ich danke Dir! :thnks:


    Ohne deine analytische Vorarbeit wäre es für mich gar nicht möglich, COMAL Packages zu entwickeln.

  • ClausS

    Genial, der CMON!

    Super Sache!


    Da das ganze Paket ja standalone läuft, könnte man es ja auslagern in den Block 7.


    Übrig bleibt nur

    • wechseln der Bank
    • starten von CMON (läuft da bis CMD 'X')
    • zurück zum COMAL


    Der Code zum wechseln der Bank darf natürlich nicht im ROM liegen ...



    Zum Glück bietet das COMAL API ja schon alles was man benötigt:

    Code
    1. COLD *=*+3 ;COLD START OF COMAL
    2. WARM *=*+3 ;WARM START OF COMAL
    3. CALL *=*+3 ;JSR TO ANOTHER PAGE.
    4. GOTO *=*+3 ;JMP TO ANOTHER PAGE.
    5. LOAD *=*+3 ;LOAD FROM PAGEX
    6. STORE *=*+3 ;STORE TO PAGEX
    7. EXEC *=*+3 ;JSR TO PAGEX
  • Ich denke mal, es wird nicht noetig sein, CMON in einen anderen Block zu verschieben.

    Wahrscheinlich ist es auch nicht moeglich, da COMAL diesen Bereich, so wie es im Moment aussieht, nicht verwalten kann.


    Stattdessen habe ich CMON etwas geaendert.

    CMON liegt jetzt im RAM-Bereich ab $7000.

    Beim starten wird zuerst die COMAL-eigene Zeropage gesichert, der IRQ-Vector wird auf den 'normalen' Wet gesetzt. ($EA31), und die Speicherstelle $01 wird mit $37 beschrieben.

    Dadurch ist es moeglich, durch Beschreiben der Speicherstelle $DE00 mit den Weren $x0 - $x5, die verschiedenen COMAL-PAGES einzuschalten und zu betrachten, usw.

    Beim Beenden von CMON ueber 'X" werden die Zeropage, und der zuvor geanderte IRQ-Vector wieder auf die COMAL-eigenen Werte zurueckgesetzt.


    Zum Speichern der Zeropage, und des Vectors wird der Speicherbereich von $C000 - $c125 benutzt.

    Fuer diesen Bereich gilt waehrend CMON aktiv ist: anschauen erlaubt, anfassen verboten.;)


    Anbei das Image mit der angepassten CMON-Version.

    COMALpackages.d64


    MfG

    Claus

  • Die Frage ist halt, was genau speichert man denn in die Datei?

    Also meiner bescheidenen Meinung nach will niemand jemals ROM speichern, es sollte immer das RAM sein. Wie sinnvoll das ist bei den von Comal benutzten Bereichen mag dahingestellt sein, aber der Kunde ist König, daher würde ich das nicht einschränken.

  • Also meiner bescheidenen Meinung nach will niemand jemals ROM speichern, es sollte immer das RAM sein. Wie sinnvoll das ist bei den von Comal benutzten Bereichen mag dahingestellt sein, aber der Kunde ist König, daher würde ich das nicht einschränken.

    Nun ja, wenn jemand ein COMAL Modul findet bei sich zu Hause.

    Und dieses Modul hat eine unbekannte Erweiterung.


    Er mag aber nicht das Modul öffnen oder er hat kein EPROM Lesegerät ...

    Dann wäre es gut wenn man das COMAL ROM einfach speichern kann. :)



    CMON liegt jetzt im RAM-Bereich ab $7000.

    Sehr cool, prima, das eröffnet ganz neue Möglichkeiten.


    Aber was ist, wenn COMAL bereits Daten abgelegt hat in diesem RAM Bereich?

  • Neue Funktionen in MATH


    Wobei diese ganzen Speicher bezogenen Befehle verlege ich bald in ein neues Package MEMORY.

    Es hat mit Mathematik nur zweitrangig zu tun.


    DEEK(adr)

    DOKE(adr, word)

    BIN2HEX$(bin$)





    .

  • Nun ja, wenn jemand ein COMAL Modul findet bei sich zu Hause.

    Und dieses Modul hat eine unbekannte Erweiterung.


    Er mag aber nicht das Modul öffnen oder er hat kein EPROM Lesegerät ...

    Dann wäre es gut wenn man das COMAL ROM einfach speichern kann. :)

    Das ist dann aber eigentlich kein Comal-Usecase, sondern eher ein allgemeiner Reverse-Engineering Usecase, oder? Wer weiß, vielleicht hat das geheimnisvolle Comal-Modul dann ja einen ganz anders implementierten BSAVE-Befehl :)?

  • Aber was ist, wenn COMAL bereits Daten abgelegt hat in diesem RAM Bereich?

    Ich muss gestehen, das habe ich mir noch nicht angesehen.


    Edit:

    So ich habe kurz mal getestet.

    Wenn der Speicher schon von einem anderen Paket belegt ist, meldet COMAL 'memory area is protected'

    Variablen werden beim 'linken' eines Pakets zurueckgestzt., da ist sowieso kein entkommen, und COMAL psst das Speicherende, und auch die Zeiger entsprechend an.

    Stehen andere Daten dort, welche nicht direkt von COMAL verwaltet werden, also falls jemand dort Daten ablegt, dann sind die natuerlich nicht geschuetzt.

  • Das ist dann aber eigentlich kein Comal-Usecase, sondern eher ein allgemeiner Reverse-Engineering Usecase, oder? Wer weiß, vielleicht hat das geheimnisvolle Comal-Modul dann ja einen ganz anders implementierten BSAVE-Befehl :) ?

    Ach so, nee ich hab mich eigentlich auf den CMON bezogen.

    Der kann jetzt auch COMAL ROM speichern.


    Ich finde, ein Monitor Programm sollte maximal flexibel sein.

    Schließlich ist das ein Tool, von dem man nie weiß für was man es einsetzen wird.

  • Ich muss gestehen, das habe ich mir noch nicht angesehen.

    Cool ist, wenn man mit LINK ein zweites Package lädt, das an dieselbe Speicheradresse kommt, dann schreibt COMAL:

    "memory area is protected"


    Vielleicht finden wir raus, wie das funktioniert.

    Denn dann könnten wir den Bereich $7xxx reservieren, für den SMON, wenn das Paket geladen ist.

  • Wenn CMON ueber den LINK-Befehl geladen wird, kuemmert sich ja COMAL selbst darum, oder meinst du einen Bereich fuer CMON resevieren, wenn CMON im EPROM integriert ist?

  • der meinst du einen Bereich fuer CMON resevieren, wenn CMON im EPROM integriert ist?

    Ja genau, wenn es im ROM ist.


    Es gibt doch diese EVENTS.


    Vielleicht kann man es so machen, dass sobald man USE TOOL macht, der Speicher reserviert wird?

    Und bei DISCARD wieder freigegeben?

  • Ich verstehe es jetzt im Moment so,

    du moechtest fuer den CMON, welcher sich im EPROM befindet, extra Speicher resevieren. Richtig?

    Falls ja, fuer was genau soltte dieser Speicher dann genutzt werden?


    Nun noch zum Aufbau der Module,

    Ein Modul kann auf SIGNALE (EVENTS) reagieren.

    Ein Paket kann beim Start eine Initialisierungsroutine aufrufen, bevor das Paket selber aktiviert wird.


    Mit dem SIGNAL koennen somit bestimmte Programme ausgefuehrt werden.


    Z.B. der Speicher welcher von CMON reseviert wurde koennte wieder freigegeben werden.

    Das kann aber CMON auch selbst, wenn man ihn mit 'x' verlaesst. Und das waere meiner Meinung nach besser.


    Interessanter ist aber wahrscheinlich die INIT-Routine vom Paket,

    damit koennte man, wenn man weiss wie, Speicher fuer CMON resevieren, bevor CMON startet.


    Aber dazu nuss ich sehen, ob ich in Erfahrung bringen kann, wie das funktioniert.


    Ich hatte mir ja schon die Variablenverwaltung angeschaut, und auch einiges in Erfahrung bringen koennen.

    Pakete, und FNC/PRC werden, soweit ich das sehe, nach dem selben System verwaltet.

    Die relevanten Pointer in der Zeropage sind dabei:


    $16 Programspeicher start

    $18 Variablenzeiger start

    $1a Stapelzeiger start

    $1c Speicherende

    $2d Stapelzeiger ende


    Wenn man sich den Speicherbereich aus $18/$19, welcher zu Beginn auf $0804 zeigt, anschaut, kann man dort die Variablen, und auch die Pakete und Funktionen finden.

    Der Aufbau ist dabei folgender:


    !by Laenge

    !by Typ

    !word address

    !pet "name"


    Die Laenge ist die Anzahl Bytes vom Anfang inkl. die Laengenangabe, bis zum Ende des Eintrags


    Typen kenne ich bisher folgende:

    $10 REAL

    $11 INT

    $12 STR

    $14 PROC (welches aufgerufen wurde)

    $18 PKG (Paket welches mit USE eingebunden wurde)


    Die Adresse zeigt auf den Variableninhalt, bzw. auf den verwendeten Paketspeicher.

    Name ist der Name der Variablen, oder des Pakets, oder Funktion.


    Das kann man sich mit dem CMON ja anschauen, und selber mal Variablen anlegen, und schauen wie diese dann im Speicher liegen.


    Vielleicht kannst du ja was mit anfangen, ich werde parallel dazu auch noch mal schauen, ob ich selber da weiter komme.



    LG

    Claus

  • Ich habe dem Paket FILES neue Funktionen hinzugefuegt


    BLOAD(name$,adr)

    laedt den Inhalt einer Datei in den Speicher ab der angegebenen Adresse. (der Speicher wird ohne Nachfrage ueberschrieben)


    BSAVE(name$,adr1,adr2)

    speichert den Bereich von adr1 bis adr2 in die angegebene Datei


    TYPE(name$)

    liesst den Inhalt einer Datei byte fuer byte auf den Bildschirm. (Steuerzeichen werden nicht auf dem Bildschirm angezeigt.)


    COLLECT

    validiert die Disk im aktuellen Laufwerk.


    Eine Package-Datei habe ich nicht erstellt, diese wird spaeter veroeffentlicht.


    Anbei mal eine neue Uebersicht, inklusive des von Diddl neu angelegtem Memory-Pakets.:applaus:



    Zur Erlaeuterung:

    Gruen waren, bzw. sind vorhandene Funktionen

    Orange wurde von Diddl eingearbeitet.

    blau ist von mir erarbeitet worden.


    Was jetzt noch fehlt:


    Ich finde, das Super-Chip-II Modul schon recht weit vorangeschritten.


    Wir bleiben auf jedenFall dran.:syshack:



    MfG

    Claus

  • Wow, schön langsam sind wir wirklich komplett! :)


    Mit den letzten drei im Math Package kämpfe ich noch.

    Es ist nicht leicht das zu optimieren und glz. möglichst Bug Free zu bekommen.


    Diese Funktionen brauchen ganz stark das Dividieren, was für einen 6502 naturgemäß eine Herausforderung ist.

    Also lohnt es sich, die Anzahl an der nötigen Divisionen zu minimieren oder auf Basis 2 zu stellen.

    Dummerweise ist die Quadratwurzel auch ein Musterbeispiel an Geschwindigkeits Bremse.

    Aber die Wurzel minimiert halt die Anzahl nötiger Try and Error Durchläufe.


    Hab auch schon mit Tabellen herum gespielt.

    Es wird zwar sehr schnell aber braucht halt viel Platz.

    Für die ROM Version wäre das vielleicht ein Thema ...

  • Die Primfaktoren Zerlegung läuft jetzt als ein einzelner Befehl: FACTORS$(zahl)


    Es läuft sehr performant und endlich auch fehlerfrei! :D



     




    Die fehlenden drei Funktionen des MATH Package basieren alle auf Primfaktoren Zerlegung.

    Insofern ist es nun nicht mehr weit, dann ist MATH auch endlich komplett! :)



    .

  • Mit dem MATH package aus dem Super Chip Modul kann man den "größten gemeinsamen Teiler" und das "kleinste gemeinsame Vielfache" bestimmen.


    Das ist gut. Aber es ist leider sehr beschränkt.


    Man kann das immer nur errechnen aus ZWEI Zahlen. Es geht nicht mit drei oder vier Zahlen.


    Unser Package wird diese Einschränkung nicht haben. Wir können das auch mit drei oder mehr Zahlen berechnen. 😊


    Natürlich wird es auch die drei Grundfunktionen geben, damit es schön kompatibel bleibt zum Superchip.