Beiträge von hans

    Ich hänge hier mal die Gerber-Dateien für das Mockingboard v1 an, sie kommen von ReactiveMicro, sind dort aber nur in einem ZIP als RAR versteckt - Falls jemand sich das Original nachbauen möchte. Der auf dieser Platine verbaute AY-3-8913 ist jedoch nicht so gut zu bekommen und bei AliExpress recht teuer. Ein Layout für eine Karte mit dem sehr viel preiswerteren AY-3-8910 habe ich bisher noch nicht gefunden.


    Ich habe mich bei meinem Selbstbau an diesen Schaltplan gehalten:



    Seltsamerweise hängen hier die VIA-IRQs an NMI und IRQ - Vielleicht ein Fehler.

    Hallo,


    ich habe noch zwei Ungereimtheiten mit ID2 an meinem Apple IIe gefunden:


    Das Apple2-IO-RPi-Board wird nicht korrekt als "Generic Smartport" erkannt - Das ROM-Image habe ich angehängt. Wenn es nützlich ist, lassen sich im ROM sicher auch noch einige ID-Bytes unterbringen, darum kann ich mich ggf. kümmern.


    Ich habe einen Analog-Joystick angeschlossen, der auch funktioniert. Dennoch wird "Joystick not connected" gemeldet. Wie wird der Joystick erkannt? Müssen am Stecker irgendwelche Brücken vorhanden sein?

    Schöne Grüße,

    Hans

    Im Gegensatz zu deren Computerableger c´t verschwand die mc aus dem FranzisVerlag irgendwann aus den Regalen.

    Dort gab es allerdings auch einige sehr interessante Artikel und sogar ein eigenes Computerselbstbauprojekt (mc68k?).

    Genau, der mc68000 war so eine Riesenplatine, praktisch ein Atari ST zum Selbstbauen. War auch als Komplettsystem für DM 8500 erhältlich. Natürlich ein schöner Traum für einen Schüler wie mich damals :)

    Allerdings - Ich erinnere mich auch noch an MC und Elrad - Letztere hat ja die Transformation aus den 80ern geschafft, indem sie die c't geboren hat - Zuerst als achtseitige (?) Mitteleinlage in der Elrad, dann als eigenständiges Heft. In den 90ern hatten c't und CHIP dann den Platz der Elektronikzeitschriften übernommen.


    Bei der c't fand ich ja sehr lustig, die Entwicklung vom Magazin zum Telefonbuch und zurück zu beobachten. Nicht verwunderlich, schließlich ging mit der wachsenden Fettleibigkeit der c't ja auch die Auflage der Telefonbücher zurück, die Heise vorher gedruckt hatte.


    Hachja... :)

    Klemm doch mal einen Kondensator zwischen PDL0 und GND. Kapazität unter 0.1 uF. Das gleiche für PDL1 und GND. So wie das in der ursprünglichen Schaltung auch gemacht wird.

    Das habe ich jetzt gemacht, mit einem 250k-Trimmer in Serie zur Abstimmung - Das funktioniert und kommt jetzt mit der Inverterschaltung für die Buttons auf eine Lochrasterplatine.

    Ich bin gestern immerhin so weit gekommen, dass ich einen passiven Adapter für einen echten Analogjoystick zum Laufen bekommen habe. Dafür benötigt es vom Prinzip her nur zwei Pulldown-Widerstände für die Tasten. Leider kommt es aber beim Apple darauf an, dass die beiden Potis im Joystick jeweils die vorgesehenen 150 kΩ haben In meinem Joystick sind jedoch 100 kΩ und 80 kΩ (?) verbaut, so dass der Wertebereich auch nach Justage des Nullpunkts nicht komplett 0-255 abdeckt. Ich werde heute auch mal probieren, ob ich mit der vorschlagenen Schaltung weiter komme.


    Hier ist die Steckerbelegung am IIe:


    Und hier die Schaltung, die die Joysticks ausliest:




    Referenz zum PC Game Port

    hat mal jemand dieses Projekt als PCB umgesetzt? Ich suche 2 Platinen und dafür lohnt neu machen nicht.


    PC to Apple II Joystick Adapter - Apple II FAQ (apple2faq.com)

    Ich habe das heute mal probiert und mit drei verschiedenen PC-Joysticks keinen Erfolg gehabt. Es kann allerdings sein, dass die Joysticks nicht OK sind, wobei mich das bei dreien schon etwas wundern würde. $40 plus Versand aus USA finde ich ein bisschen happig. tokabln hat das bei Dir funktioniert?

    Schöne Grüße,

    Hans

    Hallo Albert,


    vielen Dank für´s Nachsehen - Ich denke, ich kann das 2716 mit dem TL866II+ schon auslesen, aber wegen der hohen Programmierspannung kein neues brennen. Ich bin aber erst nächste Woche wieder in meinem Keller und dumpe es dann mal komplett, um auch nach der "16 SECTOR"-Meldung zu suchen.


    Ich melde mich mit Erkenntnissen, vielen Dank bis hier!


    -Hans

    Hallo,


    ich habe immer noch Anfängerprobleme (?) mit meinem Apple IIe, dem Disk ][-Controller-Clone und dem Diskettenlaufwerk:


    Der Apple IIe funktioniert mit einem Ehring-Controller problemlos. Ich möchte gerne ein zweites Laufwerk anschließen, und habe einen geclonten Disk ][-Controller und ein passendes Disk ][-kompatibles Laufwerk.


    Wenn ich den Disk ][-Controller in Slot 7 einbaue und den Rechner starte, wird die Meldung "16 SECTOR" angezeigt. Da ich noch keine bootfähige Diskette habe, startet der Rechner aber nicht. Wenn ich ADTPro über die serielle Schnittstelle lade, wird das Disk ][-Laufwerk nicht in der Liste der Volumes angezeigt.


    Wenn ich den Disk ][-Controller in Slot 6 und den Ehring in Slot 7 einbaue und ADTPro boote, sehe ich das Disk ][-Laufwerk nicht in der Volumes-Liste.


    Wenn ich mit diesem Setup Metacrafts FORTH vom Ehring boote, dann kann ich aus dem FORTH die Diskette im Disk ][-Laufwerk formatieren, lesen und schreiben (ich spreche sie da als Laufwerk 3 an). Unter CP/M kann ich das Laufwerk als C: ansprechen (aber ich habe keine passend formatierte Diskette).


    Ich bin jetzt ein bisschen verwirrt: Der Controller scheint zu funktionieren, und ich kann ihn auch mit FORTH ansprechen, aber mit ProDOS wird das Laufwerk nicht angezeigt. Woran kann das liegen, hat jemand eine Idee?

    Danke!
    Hans

    Hallo Retrohasen,


    heute morgen habe ich ein paar Stunden mit meiner Lieblingsprogrammiersprache gespielt und das hat mir wieder so gut gefallen, dass ich Euch teilhaben lassen möchte:


    Die Vorgeschichte:


    Mein Apple IIe steht gegenüber meinem Schreibtisch und wenn ich in Zoom-Calls bin, kann man ihn sehen. Daher dachte ich, ein bisschen Eye-Candy auf dem Grünmonitor wäre ganz nett. Da ich erstmal keine Disketten habe, habe ich so eine Art Matrix-Screensaver eingetippt. Hübsch, aber leider lähmend langsam. Dann konnte ich ein paar Disketten auftreiben und habe das Ding mit dem Microsoft-BASIC-Compiler übersetzt - Hoffend, dass die Performance dann annehmbarer sein könnte. Leider war das nicht der Fall, so dass ich das Ding dann in Metacrafts FORTH nachgebaut habe. Ich hab's einem Freund gezeigt, und der regte dann an, ich könne ja auch mal Conway´s Game of Life schreiben - Gesagt, getan, aber dafür ist FORTH wiederum zu langsam, zumal Metacrafts FORTH auch keine Primitiven zur Bitmanipulation hat.


    Also muss es also Assembler sein - ein willkommener Anlass, meine 6502-Allergie zu überwinden, natürlich viel zu spät, aber egal. Ich bin zwar ein Fan davon, Sachen direkt auf dem Zielsystem zu entwickeln, aber es erschien mir doch zu unpraktikabel und zeitraubend, auf dem Apple einen geschmeidigen Workflow aufzusetzen - Zumal ich immer noch nur ein Diskettenlaufwerk habe und sich die Disketten beim Entwickeln mit FORTH auch als nicht wirklich komplett zuverlässig erwiesen haben.


    Erstmal habe ich mit virtual 6502 auf masswerk.at angefangen. Für kleinere Sachen geht das sehr gut, aber insgesamt ist es dann doch relativ viel nervige Herumklickerei und eine HTML-Textarea ist auch nicht der beste Platz für ein größer werdendes Programm. Ich habe mich also nach Alternativen umgesehen und die recht populäre lib6502-Bibliothek gefunden. Gut geschrieben und dokumentiert, aber dann eben leider doch in C und entsprechend nicht sehr geschmeidig in der Handhabung, zumal man eben auch noch einen externen Assembler braucht. Klar, gibt es alles irgendwie integriert für VScode, aber von den entsprechenden Angeboten hat mich nichts schnell überzeugen können.


    cl-6502 erweitern


    Die einzige Programmiersprache, die mich immer wieder begeistern kann, ist Common Lisp. Kommerzielle Projekte sind damit im Moment nicht realistisch zu bauen, aber in meiner Freizeit kann mir das ja Wurst sein. Ich habe also cl-6502 von Brit Butler hergenommen und probiert, ob ich meine stümperhaften 6502-Life-Rudimente damit übersetzt bekomme. Zu meiner Überraschung akzeptierte der Assembler meinen Code ohne Fehlermeldung, was aber daran lag, dass er die Assemblerdirektiven einfach ignoriert und überlesen hat. Immerhin, mit den 6502-Instruktionen und der Syntax für die Adressierungsmodi kam er zurecht. Also musste ich nur die notwendigen Assemblerdirektiven nachrüsten, und will Euch hier berichten, was ich dazu in dem Lisp-Programm tun durfte:


    Für die Implementation der Assemblerdirektiven habe ich erstmal eine passende generische Funktion definiert:


    (defgeneric process-directive (name value pc))


    Die generische Funktion process-directive erhält als name Parameter den Namen der Direktive. In value werden die vorhandenen Argumente übergeben, pc ist der aktuelle Program Counter. Die Funktion kann jedoch erst aufgerufen werden, wenn eine oder mehrere Methoden existieren. Welche Methode ausgewählt wird, hängt von den Typen der Parameter ab. Im Gegensatz zu den meisten anderen Sprachen ist es dabei möglich, über mehrere Parameter zu dispatchen, aber diese Möglichkeit brauche ich hier nicht. Ich hätte aber schon gerne eine Fehlermeldung, wenn ich eine unbekannte Assemblerdirektive benutze, daher definiere ich eine Methode, die für beliebige Argumenttypen und -werte passt:


    (defmethod process-directive (name value pc)

    (format t "Unknown assembly directive ~A skipped~%" name)

    nil)


    Die einzelnen Direktiven definiere ich nun als weitere Methoden der generischen Funktion process-directive, wobei das Dispatching nicht über einen Typ, sondern über einen Literalwert vorgenommen wird. Beispielsweise könnte ich eine Direktive ".byte" so definieren:


    (defmethod process-directive ((name (eql :byte)) value pc)

    ;; whatever

    )


    Die Argumentliste bestimmt, dass diese Methode aufgerufen wird, wenn der name-Parameter das Keyword :byte ist. Ein Aufruf (process-directive :byte x y) würde also diese Methode ansprechen, ein Aufruf (process-directive :word x y) jedoch nicht. Das passiert zur Laufzeit und ist effizient. Die Methodendefinition ist aber ein bisschen schlecht zu lesen, da man den Namen der Direktive in der Argumentliste zwischen den ganzen Klammern finden muss. Mit einem kleinen Makro lässt sich das aber verschönern:


    (defmacro defdirective (name (value pc) &body body)

    `(defmethod process-directive ((,(gensym) (eql ,name)) ,value ,pc)

    ,@body))


    Makros werden zur Compilezeit auswertet, und das hier definierte Makro defdirective sorgt dafür, dass wir die Methode von oben wie folgt definieren können:


    (defdirective :byte (value pc)
    ;; whatever

    )


    Es gehört natürlich noch ein bisschen mehr dazu, dem Assembler die neuen Assemblerdirektiven beizubringen, aber wirklich nur ein bisschen (siehe Link). Damit wird mein Programmfragment korrekt übersetzt und erzeugt den gleichen Maschinencode wie virtual 6502.


    Jetzt möchte ich auch noch komfortabel und interaktiv entwickeln und testen. Das geht direkt aus der Kommandozeile meines Lisp-Systems ("REPL - Read Eval Print Loop"):


    Erstmal assembliere ich mein Programm und erhalte als Ergebnis einen Vektor mit den Maschinensprache-Bytes:


    MAIN> (cl-6502:asm (read-file-into-string "life.s"))

    #(76 0 16 0 1 0 0 0 0 36 0 32 0 0 0 0 0 0 0 0 ...)


    Dann kopiere ich diesen Vektor in den Speicher der emulierten 6502:


    MAIN> (setf (cl-6502:get-range 0) *)

    #(76 0 16 0 1 0 0 0 0 36 0 32 0 0 0 0 0 0 0 0 ...)


    Nun lasse ich die 6502 laufen, bis sie auf eine BRK-Instruktion trifft.


    MAIN> (cl-6502:execute cl-6502:*cpu*)

    NIL


    Und jetzt schaue ich, was sich im Speicher ab $2400 befindet - Das ist mein aktuelles Ergebnis, viel kann ich noch nicht :)


    MAIN> (cl-6502:get-range #x2400)

    #(3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 ...)


    Jetzt würde ich gerne noch Debuggen können, falls doch der unwahrscheinliche Fall eintritt und ich einen Fehler in meinem 6502-Code habe. Es wäre nützlich, wenn ich mir den Zustand der emulierten 6502 ansehen könnte, und dazu definiere ich mir eine Methode für die Systemfunktion print-object, die für Objekte der Klasse 6502:cpu verwendet wird. Ich kann nun die (globale) Variable cl-6502:*cpu* in der REPL evaluieren, und bekomme den Status der CPU ausgegeben:


    MAIN> cl-6502:*cpu*

    #<CPU PC:$0000 A:$03 X:$03 Y:$05 SR:$37 (CZI.B-..) SP:$F7 (6,014) - JMP $1000>


    Jetzt würde ich beim Debuggen gerne meinem Code bei der Ausführung zugucken. Dazu bietet es sich an, die Funktion cl-6502:step-cpu zu tracen - Sie wird in der inneren Schleife des Emulators für jede auszuführende 6502-Instruktion aufgerufen:


    MAIN> (trace 6502:step-cpu)

    (|6502|:STEP-CPU)

    MAIN> (cl-6502:reset cl-6502:*cpu*)

    #<CPU PC:$0000 A:$00 X:$00 Y:$00 SR:$24 (..I..-..) SP:$FD (0) - JMP $1000>

    MAIN> (cl-6502:execute cl-6502:*cpu*)

    0: (|6502|:STEP-CPU #<CPU PC:$0000 A:$00 X:$00 Y:$00 SR:$24 (..I..-..) SP:$FD (0) - JMP $1000> 76)

    0: |6502|:STEP-CPU returned 3

    0: (|6502|:STEP-CPU #<CPU PC:$1000 A:$00 X:$00 Y:$00 SR:$24 (..I..-..) SP:$FD (3) - LDA #$00> 169)

    0: |6502|:STEP-CPU returned 5

    ...


    Nicht schlecht, aber irgendwie doch nicht so ergonomisch, denn die Details des Aufrufs von step-cpu interessieren mich ja nicht, sondern eigentlich nur der Prozessorzustand. Also muss ich trace ein bisschen besser parametrisieren:


    MAIN> (trace 6502:step-cpu :report nil :print 6502:*cpu*)

    WARNING: |6502|:STEP-CPU is already TRACE'd, untracing it first.

    (|6502|:STEP-CPU)

    MAIN> (cl-6502:reset cl-6502:*cpu*)

    #<CPU PC:$0000 A:$00 X:$00 Y:$00 SR:$24 (..I..-..) SP:$FD (0) - JMP $1000>

    MAIN> (cl-6502:execute cl-6502:*cpu*)

    #<CPU PC:$0000 A:$00 X:$00 Y:$00 SR:$24 (..I..-..) SP:$FD (0) - JMP $1000>

    #<CPU PC:$1000 A:$00 X:$00 Y:$00 SR:$24 (..I..-..) SP:$FD (3) - LDA #$00>

    ...


    Jetzt wird also vor jeder Ausführung von step-cpu der Status der CPU ausgegeben, und dank der definierten print-object-Methode enthält die Ausgabe fast alles, was man so wissen möchte. trace kann aber natürlich auch noch mehr, ist aber Implementations-spezifisch (d.h. unterschiedliche Common-Lisp-Implementationen unterstützen unterschiedliche trace-Optionen). Ich habe dazu vor Jahren einen Blogpost geschrieben.


    So, und nun habe ich meine alte Liebe zu Common Lisp ausgelebt und morgen früh kann ich mich der Bitfummelei widmen. Danke für´s Lesen bis hier, und lasst es mich wissen, wenn ich irgendwelche Fragen zu dem Zeug beantworten kann.


    -Hans

    Mit dem Disk Controller in Slot 6 wird beim Start versucht, aufs erste Floppylaufwerk zuzugreifen. Nun brauche ich wohl wirklich ein paar Disketten. Liest hier jemand mit, der Software übrig hat? Ansonsten starte ich wohl ein Gesuch im Marktplatz.

    Ich habe meinen Apple II mit ADTPro über das Kassetteninterface gebootstrapped, das hat sehr gut funktioniert. Inzwischen habe ich aber die serielle Schnittstelle in Betrieb, das geht doch deutlich schneller. Wenn Du also einen Rechner mit Audio In/Out und ein paar leere Disketten hast, ist das vielleicht auch für Dir ein Weg.

    Die Z80 Karte in Slot 4 verhält sich unauffällig, ebenso die serielle Karte in Slot 2.

    Danke für den Hinweis auf Slot 4, da funktioniert meine Z80-Karte jetzt ein bisschen besser :D

    Die eine Karte enthält ein ROM. Wenn ich den Inhalt kenne, kann ich die Karte zur Erkennung hinzufügen, da bei der Hardware Erkennung signifikante Speicherstellen im jeweiligen ROM-Bereich ausgelesen werden. Die ADC-Karte hat kein eigenes ROM daher wird sie vom Algorithmus leider nicht erkannt.

    Gehe ich recht in der Annahme, dass die ersten 256 Bytes reichen? Dann habe ich sie hier mal angehängt. Ich habe mein EPROM-Lesegerät gerade nicht zur Hand und habe den Dump daher mit BSAVE gemacht. Ich bin aus dem Code nicht schlau geworden, was aber auch gut an meiner mangelnden Erfahrung liegen kann. :)