Ich hab mir mal die 8x8 mm Taster bestellt: https://www.ebay.de/itm/265874775715?var=565699820977
Wie werden die eigentich davon abgehalten, nach unten rauszufallen? Is da die Platine untendrunter die das hebt?
Ich hab mir mal die 8x8 mm Taster bestellt: https://www.ebay.de/itm/265874775715?var=565699820977
Wie werden die eigentich davon abgehalten, nach unten rauszufallen? Is da die Platine untendrunter die das hebt?
Ich finde es immer noch spannend, mit wie wenigen TTL die Grafik erzeugt wurde. Ich muss das glatt mal mit dem A2 vergleichen...
Die e-bay-Auktion von oben ist schon beendet... Ihr habt nicht zufällig eine echte Part number / Hersteller?
Gedruckt habe ich es schon - aber der eigentliche Taster fehlt leider noch...
Super, werde ich ausprobieren!
Das BASIC hat einiges an quirks. Ich hab das damals auch durchgemessen ... https://www.extrapages.de/arch…-of-a-microbenchmark.html
Ausserdem mal bei 8bit show and tell reinschauen. https://youtu.be/B-Cky_2l11U
Da würde ich dann als erstes mal den Interrupt prüfen. Der triggert Cursor und auch Tastatur.
Es gibt Adapter SCART-> VGA.
Aber wird da auch das Timing angepasst? VGA Timing ist deutlich schneller...
Hallo André, ich hab den SD-Adapter von AZ-Delivery genommen. Auf der neuen IO-Board Version werde ich aber darauf verzichten und einen SD-Karten Sockel mit Pegelwandlern direkt auf der Platine unterbringen.
Gibt es einen Schaltplan von AZ-Delivery?
Welchen SD-Karten Sockel willst Du nehmen? Ich suche einen der noch 'von Hand' lötbar ist. D.h. auch smd, aber ohne 'versteckte' pins.
Sehr cool.
Welchen Micro SD Adapter verwendest Du?
sieht super aus.
Wie reinigst Du die Platinen so?
sind die videos denn schon online?
Hat anscheinend sonst noch niemand gesehen: der Golem-Podcast vom 10.10.: https://www.golem.de/news/podc…computer-2310-178254.html
Edit: ist wohl hier schon diskutiert worden: @Kobrakai im Golem.de Podcast!
Aber ich denke in der Presseschau sollte er auch drin sein
Mit der Word-Vorlage, die ich erstellt habe, geht das natürlich, und sie wurde von recht vielen Ausstellern auch genutzt.
Ah Mist. Hab den online PDF Ersteller genommen. Da geht das wohl nicht. Muss ich mir fürs nächste Mal merken.
Kann man in den Aufsteller / PDF Generator Bilder setzen? Ist mir zumindest nicht aufgefallen.
Dann können alle ihre Bilder da gleich mit rein machen und sie wären ohne Mehraufwand im Katalog
CBM_Ba hatte da eine 3D druckbare Lösung mit einem Microswitch erwähnt auf der CC...
auch wenn das ein Zombie-Thread ist - noch als nachdokumentation:
Platinen gibt es von Texelec und open source von Steve Gray.
Keycap Designs habe ich gemacht, links alle hier: https://github.com/fachat/MicroPET/tree/main/Case
Ich suche nur noch nach dem shift-lock Ersatz....
Bzgl Netz: Mache ich genauso. Notfalls wird der Laptop mit dem Handy getethered...
Zu so vielen Bildern bin ich dieses Mal gar nicht gekommen. Danke an Alle fürs hier Einstellen!
Alles anzeigenDie User-Kommandos (hier U1) fand ich immer etwas suspekt, und habe immer die 'normalen' DOS-Kommandos (wäre hier B-R) verwendet.
Vielleicht gab es die auch bei DOS 1 noch garnicht?
B-R liest nur so viele Byte, wie im 1. Byte (0-indiziert) steht.
Wenn also der Block so beginnt:
Code00: 00 12 01 02 03 04 05 06 08: 07 08 09 0A 0B 0C 0D 0E 10: 0F 10 11 12 13 14 15 16 18: 17 18 19 1A 1B 1C 1D 1E
dann kann man mit B-R nur bis zur Adresse $14, also dem Wert $12 lesen. Danach bricht es ab.
Genauso mit B-W, der legt in dem Byte die Anzahl der geschriebenen Byte ab (und überschreibt den Wert damit).
Für manche Anwendungen ist das nett, für jemanden, der sich die Blöcke aber komplett anschauen will, nicht.
Ja, die B-R und B-W sind nicht als Befehle geeignet um ganze 'Blöcke' im Sinne von Disk Blocks zu lesen oder schreiben - genau aus genannten Gründen mit der Record Lenght. IIRC das folgt der Logik der REL Records des letzten Blocks einer Datei. Insb. Beim Schreiben wird auch in das erste zweite Byte die Länge des Record geschrieben.
U1/U2 sind dann dafür da, ganze Blöcke zu lesen und zu schreiben. IIRC kamen die aber erst in DOS 2 - ich meine in DOS 1 sind die noch nicht drin, kann mich aber auch irren
Edit: ich hab das jetzt nach der Beschreibung von IchBinAlt korrigiert. Aber so richtig will mein Gedächtnis das nicht akzeptieren... ich meine doch dass es das erste Byte das Blocks als Länge nimmt und nicht das Zweite. Aber das muss ich dann mal testen...
Auch von mir vielen lieben Dank an Alle, die die CC wieder zu einem solch coolen Event gemacht haben!
Insb 1ST1 für die Orga und die ganzen anderen Helfer und Helferinnen;
Toast_r für die Reparatur meines PET;
for(;;) und lydon für die Gespräche zur FPGA Programmierung;
CBM_Ba für seine PET Ausstellung und dass wir uns mal persönlich getroffen haben;
Und all den Anderen mit denen ich gesprochen habe!
Wow das ist wirklich ein Aufwand! Kudos und besten Dank für diese Arbeit!
werden die Youtube URLs hier gepostet? Dann können wir über unsere eigenen Channels auch Werbung machen
Hier meine Aufsteller - falls noch relevant.. (sorry falls zu spät)
Mein Laptop hat nur VGA und DisplayPort. Geht das auch für den Vortrag oder braucht es einen Adapter?
Die Frage bleibt aber, ob man 65816 überhaupt mit einer MMU kombinieren muss
Hallo André, vielen Dank für den Link. Ich muss mir das dann daheim mal ansehen, hier hab ich gerade nur mein Handy zum drauf schauen.
Die MMU war für mich eben auch ein Anreiz, um den Tasks mehr als 64KB linearen Speicher zu bieten. Das dadurch mögliche schnelle Task Switching ist da eher noch eine schöne Dreingabe. Ich möchte dafür ein SRAM mit 16 Bit Datenbus nehmen, dann hätte ich bei 4KB Seitengröße auch noch 4 Bit für einen rudimentären Speicherschutz (read/write) und Unterstützung für Paging (available, dirty) frei.
Die Idee mit der SRAM MMU hatte ich vor einigen Jahren mal irgendwo als Ersatz für eine Motorola 68xx MMU gesehen. Seither schwirrt der Gedanke einer etwas Erweiterten Version bei mir durch den Kopf. Ist also auch für mich soz. einer der Antriebs Punkte für den neuen Rechner.
Die 74LS610 hatte 12 bit. 8 habe ich für Adresserweiterungen genutzt, und 3 weitere für:
- page valid
- write protect
- no-execute
Details siehe hier: http://www.6502.org/users/andre/csa/cpu/index.html
Da die 6502 aber kein ABORT kennt wird im Fehlerfall die 6502 nur via RDY (geht grundsätzlich damit nur mit CMOS, da writes in NMOS nicht halten) angehalten, und die Auxiliary CPU übernimmt den Bus (siehe hier http://www.6502.org/users/andre/csa/auxcpu/index.html )
Wäre sicher interressant, das ganze via ABORT und nur einer CPU zu lösen. Bei ABORT müsste man die MMU dann z.B. in einen "Default" Config setzen - entweder per HW (z.B. kernel in top page einblenden) oder einfacher per SW wenn der kernel / top page mit den Vektoren eh immer gemappt ist.
Sieht nach einem spannenden Projekt aus!
Hier mal ein Beispiel für eine MMU basierend auf fast SRAM - damals als Ersatz für den nicht mehr zu bekommenden 74LS610 gedacht: http://www.6502.org/users/andre/hwinfo/ls610/index.html
Die Frage bleibt aber, ob man 65816 überhaupt mit einer MMU kombinieren muss. Schliesslich könnte man einzelne Tasks in andere Banks legen (solange sie nicht mit $0100,x auf den Stack zugreifen...) Das OS, sowie die Task-spezifischen Stacks und Zeropages könnten in Bank 0 liegen, nur code/data in den Task-spezifischen Banks. So ähnlich habe ich mir das für meine (bisher nur geplante) Erweiterung von GeckOS mal zurechtgelegt.
Gruß,
André
BTW logging... ich gebe zu, das Log ist aus einem Emulator den ich für das System geschrieben habe...
In system logging gibt es im Moment nicht wirklich. Nur stdio, was man auf eine Konsole oder Datei legen kann...
Und da wir gerade von interruptbaren Schedulern reden....
System: meine Port für die Original-Maschine CS/A, i.e. PET-Clone mit MMU at $effx, die die 16x4k CPU address pages einzeln aus einem 1M bus address space mappen kann. Also $eff3 mapped dann den Speicher $3xxx der CPU eben in den physikalischen Adressraum.
Symptom: häufig aber nicht immer hängt sich die Maschine beim Booten auf, und zwar wenn Programme von der Disk geladen werden. In diesem Fall ein Monitor auf der zweiten Konsole und eine Shell auf der ersten Konsole. Heisenbug, ziemlich nervig.
Den Fehler habe ich genau hier im interrupteten Scheduler gefunden....:
18-Sep-23 23:38:32 74368091 f643 A:00 X:00 Y:00 P:ff S:-V1---ZC 20 a1 f0 jsr setthread
18-Sep-23 23:38:32 74368097 f0a1 A:00 X:00 Y:00 P:fd S:-V1---ZC c5 0f setthread cmp actThread
18-Sep-23 23:38:32 74368100 f0a3 A:00 X:00 Y:00 P:fd S:NV1----- d0 01 bne doit
18-Sep-23 23:38:32 74368103 f0a6 A:00 X:00 Y:00 P:fd S:NV1----- 8d 43 06 doit sta newThread
18-Sep-23 23:38:32 74368107 f0a9 A:00 X:00 Y:00 P:fd S:NV1----- a6 0f ldx actThread
18-Sep-23 23:38:32 74368110 f0ab A:00 X:20 Y:00 P:fd S:-V1----- e0 ff cpx #$ff
18-Sep-23 23:38:32 74368112 f0ad A:00 X:20 Y:00 P:fd S:-V1----- f0 24 beq nosave
18-Sep-23 23:38:32 74368114 f0af A:00 X:20 Y:00 P:fd S:-V1----- ac 70 05 ldy actEnv
18-Sep-23 23:38:32 74368118 f0b2 A:00 X:20 Y:38 P:fd S:-V1----- b9 72 05 lda $0572,y
18-Sep-23 23:38:32 74368122 f0b5 A:01 X:20 Y:38 P:fd S:-V1----- 8d f3 ef sta $eff3
18-Sep-23 23:38:32 74368126 f0b8 A:01 X:20 Y:38 P:fd S:-V1----- ad 06 30 lda $3006
18-Sep-23 23:38:32 set pia1 CB1 to 0
18-Sep-23 23:38:32 set IRQ 01 to 1
18-Sep-23 23:38:32 irq: push f0bb as rti address - set pc to IRQ address feef
18-Sep-23 23:38:32 74368130 feef A:00 X:20 Y:38 P:fa S:-V1--IZ- 48 pirq pha
18-Sep-23 23:38:32 74368136 fef0 A:00 X:20 Y:38 P:f9 S:-V1--IZ- 8a txa
18-Sep-23 23:38:32 74368138 fef1 A:20 X:20 Y:38 P:f9 S:-V1--I-- 48 pha
18-Sep-23 23:38:32 74368144 fef2 A:20 X:20 Y:38 P:f8 S:-V1--I-- 98 tya
18-Sep-23 23:38:32 74368146 fef3 A:38 X:20 Y:38 P:f8 S:-V1--I-- 48 pha
18-Sep-23 23:38:32 74368152 fef4 A:38 X:20 Y:38 P:f7 S:-V1--I-- d8 cld
18-Sep-23 23:38:32 74368154 fef5 A:38 X:20 Y:38 P:f7 S:-V1--I-- ba tsx
18-Sep-23 23:38:32 74368156 fef6 A:38 X:f7 Y:38 P:f7 S:NV1--I-- bd 04 01 lda $0104,x
18-Sep-23 23:38:32 74368160 fef9 A:62 X:f7 Y:38 P:f7 S:-V1--I-- 29 10 and #$10
18-Sep-23 23:38:32 74368162 fefb A:00 X:f7 Y:38 P:f7 S:-V1--IZ- f0 03 beq pb1
18-Sep-23 23:38:32 74368165 ff00 A:00 X:f7 Y:38 P:f7 S:-V1--IZ- 20 c0 f1 pb1 jsr memsys
18-Sep-23 23:38:32 74368171 f1c0 A:00 X:f7 Y:38 P:f5 S:-V1--IZ- 08 memsys php
18-Sep-23 23:38:32 74368174 f1c1 A:00 X:f7 Y:38 P:f4 S:-V1--IZ- 78 sei
18-Sep-23 23:38:32 74368176 f1c2 A:00 X:f7 Y:38 P:f4 S:-V1--IZ- 48 pha
18-Sep-23 23:38:32 74368182 f1c3 A:00 X:f7 Y:38 P:f3 S:-V1--IZ- a9 00 lda #$00
18-Sep-23 23:38:32 74368184 f1c5 A:00 X:f7 Y:38 P:f3 S:-V1--IZ- 8d f3 ef sta $eff3
18-Sep-23 23:38:32 74368188 f1c8 A:00 X:f7 Y:38 P:f3 S:-V1--IZ- ad 10 30 lda $3010
18-Sep-23 23:38:32 74368192 f1cb A:01 X:f7 Y:38 P:f3 S:-V1--I-- ee 10 30 inc $3010
18-Sep-23 23:38:32 74368198 f1ce A:01 X:f7 Y:38 P:f3 S:-V1--I-- c9 00 cmp #$00
18-Sep-23 23:38:32 74368200 f1d0 A:01 X:f7 Y:38 P:f3 S:-V1--I-C f0 03 beq msys
18-Sep-23 23:38:32 74368202 f1d2 A:01 X:f7 Y:38 P:f3 S:-V1--I-C 68 devr pla
18-Sep-23 23:38:32 74368206 f1d3 A:00 X:f7 Y:38 P:f4 S:-V1--IZC 28 plp
18-Sep-23 23:38:32 74368210 f1d4 A:00 X:f7 Y:38 P:f5 S:-V1--IZ- 60 rts
18-Sep-23 23:38:32 74368216 ff03 A:00 X:f7 Y:38 P:f7 S:-V1--IZ- a5 10 lda p5
Alles anzeigen
Hinweis: Jeder Thread hat zwei Bytes in der Zeropage (zth, 6/7), die für ihn reserviert sind, jeder Task ebenso (zta, 4/5), und jedes "environment" (zen, 2/3). Diese müssen natürlich bei jedem Context-Switch umgeschrieben werden. In Systemen wie dem C64 oder PET, die nur ein "Environment" (also im Grunde nur eine zeropage/stack) kann man die dann einfach in die gespeicherten Task-/Thread-Tabellen umkopieren.
In einem system wie dem CS/A hier mit MMU hat aber jeder Task sein eigenes Environment mit eigenem Stack und zeropage. Da muss das umkopieren darüber erfolgen, dass die Task-spezifische Page woanders eingeblendet wird und die Daten von/nach dort kopiert werden. Hier wird Page 3 ($3xxx, bzw. MMU entry an $eff3) verwendet.
In obigem Code switcht "settask" auf einen neuen Thread/Task um. Mittendrin kommt ein Interrupt, der mit "memsys" versucht "nochmal" in den kernel zu kommen. Das merkt er auch schnell und macht via devr einen short path.... Allerdings muss er, um das zu merken, den Entry-Counter des Kernel lesen - dazu mappt die Routine den kernel zero-block ($0xxx) auf die CPU page 3 - genau dahin, wo der Scheduler in setthread den zero-block eines Tasks gemappt hat, um dessen zta/zth values umzuschreiben...
Warum fällt das so spät auf - weil erst die lib6502-basierten Programme diese zta und zth Speicher via die lib6502 implementierung nutzen ....
Edit: das log-file enthält im Prinzip den kompletten Boot-Prozess, ist ca. 3.6GB groß, und es hat > 2 Tage gebraucht das zu flöhen....!
Ohne Raffzahn jetzt im einzelnen zu zitieren - am Ende sind wir denke ich gar nicht so weit auseinander.
Auch bei mir ist der IRQ ein "Sprung in den kernel" eben mit einer eigenen Routine. Das wird im Taskstatus vermerkt ob eben aus dem Interrupt oder aus einem Blocking call oder YIELD. Und wenn der Task wieder dran ist wird entsprechend zurückgesprungen.
Der "Scheduler" ist fast ein eigener Task, nur läuft er eben im kernel space - aus Effizienzgründen. Der Scheduler ist sogar interruptbar. Wenn ein Interrupt passiert, werden zuerst die Interrupt-Routinen aufgerufen und damit das Interrupt flag gelöscht. Damit kann der kernel ein CLI machen, und in den Scheduler springen. (Ich bin mir allerdings nicht mehr ganz sicher ob in jedem Port, weil ich mich erinnere dass ich im Original-Port einen I/O hatte in dem ich die IRQ Leitung separat lesen konnte und ich nicht mehr weiss ob das genutzt wird)
Bezgl. Lauffähiger Tasks - da Interrupts nur bedingt in den Scheduler eingreifen können (aktuell) können sie dafür Signale absetzen. Da wird dann der Kontext und Stack des wartenden/interrupteten Tasks entsprechend modifiziert, so dass beim Wiederanlauf erst die Signal-Routine aufgerufen wird, und die dann mit IIRC RTI in den ursprünglichen Code zurückspringt. D.h. ein "waiting for signal" task gilt auch als lauffähig. "waiting for receive" (wie z.B. die Dateisystem-Tasks wenn sie nichts zu tun haben) sind nicht lauffähig, denn sie warten auf einen anderen Task.
Für IO gibt es zwei Möglichkeiten: mit char-devices via Streams zu kommunizieren, wie z.B. Konsole oder Serial. Alles andere ist asynchron. Typischerweise gibt es einen eigenen Task, der mit RECEIVE auf Aufträge wartet etwas zu tun. Wobei die eigentliche Datenkommunikation auch über Streams abläuft. Der "FSDEV" task übernimmt dabei die Aufgabe, die Devices auf ein Filesystem abzubilden, so dass man Devices wie Dateien ansprechen kann und nicht nur über den DEVCMD kernel call.
Da der SEND/RECEIVE buffer als eines der letzten Überbleibsel noch an einer fixen Adresse steht ($0200) und die character-weise Übertragung von Dateien via Streams laaaanngggsssaaaammm ist, will ich beides über sog. Buffer und Channel neu umsetzen: https://github.com/fachat/Geck…er/GeckOS-NG-Buffers.adoc