Startadresse C64 Basic

Es gibt 31 Antworten in diesem Thema, welches 5.873 mal aufgerufen wurde. Der letzte Beitrag (30. November 2015 um 23:51) ist von -trb-.

  • Interrupts könnte man natürlich auch ohne vollständige CIA-Emulation machen. Es ist ja nur ein schlichter Takt für das Interrupt-Signal erforderlich.

    Wenn man lediglich BASIC zum Laufen bringen will, muß man sicher keinen vollständigen C64 emulieren. VIC müßte lediglich den normalen Textmodus darstellen können. Und SID wird gar nicht benötigt. Und bei den CIAs dürfte ein Interrupt-Timer (der nichtmal programmierbar sein muß) und die Tastaturabfrage ausreichen.

    Wenn der ROM-Inhalt vor dem Reset ins RAM kopiert wird, was der Ausgangspost suggerierte, dann kann die PLA wohl auch stark vereinfacht werden, was dann lediglich bedeutet, daß CPU und VIC auf das selbe RAM zugreifen. Dann würde tatsächlich eine 6502 statt 6510 reichen, und der I/O-Bereich wäre fest im Adressraum vertreten, was das KERNAL ohnehin erwartet.

  • Geht nur mir das so, dass der Start-Beitrag nicht sichtbar ist?

    Nein, war kaputt, aber jetzt geht es wohl niemanden mehr so... hoffe ich...

    sl FXXS

    Bitte melde dich an, um diesen Link zu sehen.  Bitte melde dich an, um diesen Link zu sehen.

  • Ich würde ja einfach mal durchklappern, was genau KERNAL-Reset so macht
    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.

  • Auf diese Frage "was Kernel-Reset so macht" kann ich noch eine Erfahrung von meinem Mini-Emulator beisteuern: vom VIC wird ein Register (aktuelle Vertikal-Zeile, D012 und oder D011 (?)) in einer Schleife abgefragt, ob der VIC auch wirklich die Zeilen "zählt" oder hängt.

    Wird hier immer dasselbe gelesen, hängt sich der emulierte C64 in ebendieser Schleife auf. Das war für mich ein Fallstrick, als ich den anfänglichen VC-20 Emulator auf C64 umgestrickt habe. Also muß man irgendwie bei jedem Lesezugriff dieses Register emulatorseitig "künstlich" updaten, z.b. incrementieren. (i++)

    Das RAM/ROM-Thema bzw. die Vereinfachung sah dann so aus, dass Schreibzugriffe auf $A000 abgefangen und blockiert wurden. Davon zeigt sich dann die Speichergrößenermittlung des Kernel so beeindruckt, dass sie an dieser Stelle stoppt und nicht den frisch ins Pseudo-ROM geladenen BASIC-Code überschreibt...... sondern die richtigen 38911 bytes free meldet.

  • Auf diese Frage "was Kernel-Reset so macht" kann ich noch eine Erfahrung von meinem Mini-Emulator beisteuern: vom VIC wird ein Register (aktuelle Vertikal-Zeile, D012 und oder D011 (?)) in einer Schleife abgefragt, ob der VIC auch wirklich die Zeilen "zählt" oder hängt.

    Wird hier immer dasselbe gelesen, hängt sich der emulierte C64 in ebendieser Schleife auf.

    Ja, das "Problem" ist bekannt. Aber für einen einfachen Emulator reicht ja
    40x25er Text und minimale Chipsetsimulation:

    VICII:
    - einfach den Speicher ab 1024 als Text darstellen
    - D011 (?) gibt nur x00 zurück (=> Schleife im Kernal
    bleibt nicht hängen, beim Wert 00 bin ich mir aber
    nicht 100%ig sicher, es ist aber ein konstanter Wert)

    CIA:
    - paralleles IO (sehr einfach implementierbar)
    - Timer-IRQ: hier braucht man nur den 60Hz IRQ
    für die Tastatur (d.h. man muss nur das
    IRQ-Flag abfragen bzw. behandeln)

    Tastatur: (kann schnell sehr ekelig werden)
    - dazu den PC-Tastaturcode per Matrix auf die
    parallelen CIA-Ein/Ausgänge abbilden.
    Mit Shift/Ctrl und Sonderzeichen etc. kann das sehr
    schnell kompliziert werden. Im Endeffekt kommt
    man glaube ich nicht um einen Zustandsautomaten
    rum.

    PLA:
    - braucht man nicht, statt dessen einfache
    Buslogik mit simpler Addressauflösung

    Diesen Aufbau habe ich in vielen Projekten
    im Einsatz, BASIC lässt sich damit wunderbar
    benutzen. Die Komplexität liegt hier also nur
    in der 6502- bzw. 6510-Implementierung,
    die ist aber auch nicht so schlimm.

  • Guten Abend
    @ M.J: Vielen Dank; Ich werde diesen Interpreter bei gelegenheit mal anschauen.

    Vielen Dank für eure Rückmeldungen.

    Die Aufgabe ist fix. Wie schon geschrieben: Der C64 Emulator muss nicht vollumfänglich sein. (z.B. für den VIC reicht der Text Modus)
    Wenn der Basic Interpreter drauf läuft, reicht das.

    - den c6502 haben wir. (bis auf die Interrupts) fertig.
    - VIC, Text Modus, ohne Interrupts ist ebenfalls fertig
    - CIA Matrix haben wir fertig.

    Was noch fehlt ist die Interrupt Geschichte. (Beim C6502, CIA und VIC)

    Wenn wir das richtig verstanden haben, wird dem CPU mitgeteilt, dass ein Interrupt auszulösen ist. Der CPU (sofern Interrupts) eingeschalten sind, legt A,X,Y, PC auf den Stack, springt indirekt zu (0x0314/0x0315)
    Bitte melde dich an, um dieses Bild zu sehen.
    (=Interrupt Subroutine)

    Die Routine bei 0xEA81 holt dann alle gesicherten Register wieder vom Stack
    und springt wieder an den zurück an Position vor dem Interrupt.
    Ich vermute das Zurücksetzen des Interrupt Pointers ist Sache des Entwicklers. (Verifiziert habe ich es aber noch nicht)

  • Erst mal spring die CPU indirekt über $fffe/$ffff. $0314 kommt dann erst durch "Software" zum tragen.
    Das Register-Retten passiert hier:

  • Was noch einge Gretchen Frage ist:


    wie wird folgendes Szenario gehandhabt:
    IRQ wird ausgelöst:
    C6502 sichert register, springt zu soubroutine
    Während der CPU in der Soubroutine ist, wird ein neuer Interrupt ausgelöst.


    Wird jetzt wieder ein Interrupt ausgelöst? (eher unwahrscheinlich?)Wird der neue Interrupt ausgelöst, sobald 0xEA81 abgearbeitet ist?

    Wann wird das Interrupt Flag wieder gelöscht?Wann reagiert der C6502 wieder auf einen neuen Interrupt?

    Lg

  • Hast du mal erwogen, eine Referenz zum 6502 zu lesen, wie z.B. das Bitte melde dich an, um diesen Link zu sehen.?

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Aber die 6502-Dokumentation hast Du gelesen, oder? Die sollte eigentlich schon die meisten Deiner Fragen beantworten, insbesondere wie Interrupts abgearbeitet werden. Bevor man einen Emulator schreibt, sollte man schon die grundlegenden Funktionen der CPU verstanden haben.

    Am C64 läuft der Systemtimer über IRQ, und die Restore-Taste löst den NMI aus. Daher kann durchaus ein weiterer Interrupt auftreten, während schon einer abgearbeitet wird.

  • Hallo Zusammen

    Danke für eure Antworten.

    Aber die 6502-Dokumentation hast Du gelesen, oder? Die sollte eigentlich schon die meisten Deiner Fragen beantworten, insbesondere wie Interrupts abgearbeitet werden. Bevor man einen Emulator schreibt, sollte man schon die grundlegenden Funktionen der CPU verstanden haben.

    Am C64 läuft der Systemtimer über IRQ, und die Restore-Taste löst den NMI aus. Daher kann durchaus ein weiterer Interrupt auftreten, während schon einer abgearbeitet wird.

    Ja. Wusste nur nicht mehr, dass das dort explizit erwähnt wird. Jetzt nochmals durchgelesen und die Fragen geklärt. Bis auf die Interrupts haben wir alle Opcodes implementiert.

    Wie schon erwähnt einen teilweisen funktionellen c6502 haben wird.

    Wir haben bereits ein Hello World in Asm geschrieben und ausgeführt:
    Der Bildschirm wird jedenfalls mit einer KERNAL-Routine gelöscht und die Zeichen werden anschliessend auf dem Bildschirm ausgegeben.
    "Bitte melde dich an, um dieses Medienelement zu sehen."

    Bitte melde dich an, um dieses Bild zu sehen.
    Beim Reset des C6502 hängt der Rechner (wie oben erwähnt noch an einigen Stellen) - Aber da arbeiten wir dran. (Der Code des KERNAL Roms ist mMn gut dokumentiert)

  • Beim "Hello World" sehe ich noch Optimierungspotential. :) Den String kann man per Kernalroutine ausgeben lassen. Vor dem Bildschirmlöschen kann die gewünschte Farbe für Textausgaben gesetzt werden (Adresse weiß ich aus dem Kopf nicht), dann wird das gesamte Colorram damit beschrieben. Noch einfacher ist es, die jeweiligen PETSCII-Steuerzeichen für Bildschirmlöschen und Zeichenfarbe an den Anfang des Strings zu setzen. Dann muss nur der String ausgegeben werden. Eine PETSCII-Tabelle findet sich bspw. im Bitte melde dich an, um diesen Link zu sehen..