Christoph M. schrieb: > Da ich keine Juniorcomputer habe, versuche ich es mit einem > zusammengebastelten Simulator. Der kommt aber irgendwie auf 537.6Hz. > Ob es am Simulator liegt oder am Programm, versuche ich gerade > herauszufinden. Du hast nur die Delay-Routine beruecksichtigt: ldx 2 cyc, jsr kostet 6 cyc, STA und LDA je 4 cyc, EOR 2 cyc und der JMP kostet 3cyc -> 21 Cyc dazu (pro Durchgang loop). Bei Deiner ShortDelay-Routine sollte 5*n + 2 + 6 (5N+8) sein.
:
Bearbeitet durch User
Harald K. schrieb: >> Aber wo, werden diese gespalten in Y und X? > > 3822 = 0x0eee > > Also liegt die "Spaltung" bei 0x0e und 0xee > > 0xee kommt in das schneller herabgezählte Register, 0x0e in das andere, > das erst bei Unterlauf des schnelleren Registers herabgezählt wird. Hallo Harald K. , auf jeden Fall, DAKESCHÖN! Das ist richtig! Ja, das sehe ich genauso. Zufälliger Weise, habe ich es mit den gleichen Versuchen eingetragen. Prima, gut gemacht! Im Moment habe ich um die 30 Hz. Also, wenn Töne getroffen werden, wäre das ja auch schon gut, Natürlich versuche ich das Wohl-Temperierte-System, -; und wenn es nur die Pythagoreische wäre. [Dafür müssten dann die schwarzen Tasten gespalten werden; das ist natürlich quatsch :-)) ] Jetzt geht es nur um 8 Töne, am Besten in C-Dur. Dabei fällt mir ein, ich lege in den oberen Bereich einfach einen 2er-Faktor über FF Wie 16, 32, 64, o. ä. -. - D.h.: 01, 10, 100, o. ä. -. Als Wellenlänge sind die längeren Wellen genauer. Als Frequenz ist der obere Bereich genauer. 39 Wellen auf den Skop, für das "G" das wäre schon was. Also ich experimentiere Weiter, Liebe Grüße Günter K.
Christoph M. schrieb: > Rein rechnerisch würde ich ja sagen, dass es so stimmt. > Da ich keine Juniorcomputer habe, versuche ich es mit einem > zusammengebastelten Simulator. Der kommt aber irgendwie auf 537.6Hz. > Ob es am Simulator liegt oder am Programm, versuche ich gerade > herauszufinden. Bei einem real Junior Computer mit einem ganzen MHz bekomme ich (mit Deinem Programm) 432.5Hz lt. Logicanalysator. Wenn Du in Zeile 10 Deines Programmes LDX $DE (= 222 dec), bekommst Du 440.1Hz (lt. des Logic-Analysator) Das Prograemmle:
1 | .ORG $300 |
2 | PAD EQU $1A80 |
3 | PADD equ $1A81 |
4 | PBD equ $1A82 |
5 | PBDD equ $1A83 |
6 | |
7 | ; generate a 440 Hz square wave |
8 | |
9 | lda #$1 |
10 | sta PBDD ; set PB0 to output |
11 | loop: |
12 | ldx #222 ; 5us×222+5us |
13 | jsr shortdelay |
14 | lda PBD ; Read port B |
15 | eor #$01 ; Toggle bit 0 |
16 | sta PBD ; Write back |
17 | jmp loop |
18 | |
19 | shortdelay: |
20 | dex ; |
21 | bne shortdelay ; |
22 | rts ; |
und der Hexcode zum Selbst-in den Junior tickern:
1 | 0300: A9 01 8D 83 1A A2 DE 20 |
2 | 0308: 15 03 AD 82 1A 49 01 8D |
3 | 0310: 82 1A 4C 05 03 CA D0 FD |
4 | 0318: 60 |
Ja, das waren die alten Zeiten, und ich bin froh, dass das Geschichte ist.
:
Bearbeitet durch User
Thomas W. (datenreisender) 04.05.2025 14:30 >Bei einem real Junior Computer mit einem ganzen MHz bekomme ich (mit >Deinem Programm) 432.5Hz lt. Logicanalysator. Oh, super cool, danke :-) Ich war mir auch nicht sicher ob man den Port der PIA für das EOR zurück lesen kann. Die Frage hast Du damit gleich mit beantwortet.
Thomas W. schrieb: > Wenn Du in Zeile 10 Deines Programmes LDX $DE (= 222 dec), bekommst Du > 440.1Hz (lt. des Logic-Analysator) Was ist eigentlich mit den Interrupts für Tastatur und Display, die derzeit noch zwischenfunken und zu (aus Sicht des Hauptprogramms) unbestimmten Zeitpunkten zusätzliche erratische Verzögerungen bewirken? Ich habe den Verdacht, dass das die Pythagoreische Stimmung noch ein wenig trüben könnte. ;-) Thomas W. schrieb: > Ja, das waren die alten Zeiten, und ich bin froh, dass das Geschichte > ist. Jepp. Früher war alles besser - vor allem die Zukunft! (Lesch?) (re)
Re (r42) 04.05.2025 19:17 >Was ist eigentlich mit den Interrupts für Tastatur und Display, die >derzeit noch zwischenfunken und zu (aus Sicht des Hauptprogramms) Wer sagt denn, dass es Interrupts gibt?
Günter K. (enk) 04.05.2025 13:04 >Also, wenn Töne getroffen werden, wäre das ja auch schon gut, >Natürlich versuche ich das Wohl-Temperierte-System, -; >und wenn es nur die Pythagoreische wäre. Ich meine fast, dass auch nur 1 Byte für 8 Frequenzen reicht:
1 | ;***************************************************************************** |
2 | ; |
3 | ; erzeuge eine Tonleiter mit Rechecktönen |
4 | ; |
5 | ; Zielfrequenzen |
6 | ; f = 261.63 293.66 329.63 349.23 392.00 440.00 493.88 523.25 |
7 | ; |
8 | ; Hardware: 6502, fcpu=1MHz |
9 | ; |
10 | ;***************************************************************************** |
11 | |
12 | lda #$1 |
13 | sta PBDD ; set PB0 to output |
14 | |
15 | mainloop: |
16 | ; C |
17 | lda #200 |
18 | sta 0 ; teiler register |
19 | jsr playnote |
20 | |
21 | ; D |
22 | lda #158 |
23 | sta 0 ; teiler register |
24 | jsr playnote |
25 | |
26 | ; E |
27 | lda #121 |
28 | sta 0 ; teiler register |
29 | jsr playnote |
30 | |
31 | ; F |
32 | lda #104 |
33 | sta 0 ; teiler register |
34 | jsr playnote |
35 | |
36 | ; G |
37 | lda #73 |
38 | sta 0 ; teiler register |
39 | jsr playnote |
40 | |
41 | ; H |
42 | lda #45 |
43 | sta 0 ; teiler register |
44 | jsr playnote |
45 | |
46 | ; A |
47 | lda #20 |
48 | sta 0 ; teiler register |
49 | jsr playnote |
50 | |
51 | ; C |
52 | lda #9 |
53 | sta 0 ; teiler register |
54 | jsr playnote |
55 | |
56 | jmp mainloop |
57 | |
58 | playnote: |
59 | ldy #50 ; duration |
60 | |
61 | loop: |
62 | ; default delay |
63 | ldx #180 ; 5us×179+5us=900us |
64 | jsr shortdelay ; 6 cyles |
65 | |
66 | ; additional dela |
67 | ldx 0 ; teiler register |
68 | jsr shortdelay |
69 | |
70 | lda PBD ; Read port B |
71 | eor #$01 ; Toggle bit 0 |
72 | sta PBD ; Write back |
73 | dey |
74 | bne loop |
75 | rts |
76 | |
77 | ; Total time (in microseconds)=5N+5 |
78 | shortdelay: |
79 | dex ; 2 cyc |
80 | bne shortdelay ; 3 cyc jmp , 2 no jmp |
81 | rts ; 6 cyc |
82 | |
83 | |
84 | ; MOS6532 PIA addreses |
85 | org $1A80 |
86 | PAD: |
87 | |
88 | org $1A81 |
89 | PADD: |
90 | |
91 | org $1A82 |
92 | PBD: |
93 | |
94 | org $1A83 |
95 | PBDD: |
Im Anhang der Sound, wie er vom Emulator erzeugt über den Fernsehlautsprecher abgespielt klingt.
Christoph M. schrieb: > Re (r42) 04.05.2025 19:17 >>Was ist eigentlich mit den Interrupts für Tastatur und Display, die >>derzeit noch zwischenfunken und zu (aus Sicht des Hauptprogramms) > > Wer sagt denn, dass es Interrupts gibt? Nur so eine Vermutung: Günter K. schrieb: > Dabei geht es mir nicht darum, - das Keyboard nicht zu bauen, > sondern sich die Spielerei zu erlauben, die schon gegebene Tastatur zu > benutzen. Irgendwie muss die Tastatur ja abgefragt werden, wenn sie mal zum Spielen benutzt wird. Könnte man natürlich auch als Teil der Verzögerungsschleife machen. (re)
Re schrieb: > Irgendwie muss die Tastatur ja abgefragt werden, wenn sie mal zum > Spielen benutzt wird. Das wird dann im weiterführenden Experten-Kurs im Jahre 2027 realisiert.
Ich hatte je die Junior-Handbuecher verlinkt, dort wird auch erklaert, wie die Tastatur und das Display angesteuert wird. Hint: Keine Interrupts. Kein UART. I/O (sowohl seriell als auch Tape) im Polling. Das waren die Achtziger.
Thomas W. schrieb: >
1 | > shortdelay: |
2 | > dex ; |
3 | > bne shortdelay ; |
4 | > rts ; |
5 | > |
Wobei man beachten sollte, dass beim 6502 die Dauer des BNE davon abhängt, ob eine 256-Byte-Grenze übersprungen wird.
Klaus schrieb: > Günter K. schrieb: >> Ich weiß aber noch nicht, - was ich wo, einordnen sollte? XY oder YX > > Auch wenn ich befürchte, dass du die Analogie nicht verstehst: > > Nehmen wir an, du musst 1000 Sekunden warten, kannst aber nur bis 100 > zählen. > Ist es dann egal ob du 10 mal 100 Sekunden wartest oder 100 mal 10 > Sekunden? Ganz einfach (doch so(!) einfach ist es nicht!) Ich zähle so und sooft das Y hoch, die dann jedes Mal ebenfalls auch, so und sooft multipliziert wird, bis die passende Zahl erreicht wird. Allerdings mit dem Vorteil, dass das verbleibende X jedes Mal nur einmal vorkommt. Bis der entsprechende Nimmt man die 49 Hz, dann ist das G1, zähle ich noch 5 Wellen dazu, dann habe ich mit den 55 Hz das A1. Nimmt man die 55 Hz mal 4 multipliziert ergibt 440 Hz. Den Wert für das A4 hat mir jemand von Euch geschickt. Ich bekomme gerade Besuch, und melde mich später nochmal. Liebe Grüße Günter K. (Enk)
Günter K. schrieb: > Ganz einfach (doch so(!) einfach ist es nicht!) > Ich zähle so und sooft das Y hoch, die dann jedes Mal ebenfalls auch, so > und sooft multipliziert wird, bis die passende Zahl erreicht wird. > Allerdings mit dem Vorteil, dass das verbleibende X jedes Mal nur einmal > vorkommt. > Bis der entsprechende > Nimmt man die 49 Hz, dann ist das G1, zähle ich noch 5 Wellen dazu, dann > habe ich mit den 55 Hz das A1. Nimmt man die 55 Hz mal 4 multipliziert > ergibt 440 Hz. Gute Besserung!
Weiter oben ist ein nicht besonders gut lesbarer Schaltplan gepostet, hier gibts einen besseren. (Quelle: http://retro.hansotten.nl/wp-content/uploads/2022/10/schematic_junior_computer.jpg. Da da schon jpg, hab' ich das jetzt nicht konvertiert) Der 6532 könnte einen Interrupt auslösen, das ist der einzige Baustein, der an der /IRQ-Leitung des 6502 angeschlossen ist.
Harald K. (kirnbichler) 05.05.2025 07:44 >Der 6532 könnte einen Interrupt auslösen, das ist der einzige Baustein, >der an der /IRQ-Leitung des 6502 angeschlossen ist. Darüber hatte ich auch schon nachgedacht. Das Thomas oben erwähnte Beispielprogramm funktioniert ohne. Die Frage ist, ob die Auflösung des 6532 eine genügend granulare Frequenz für die Rechtecktonerzeugung hergibt. Die Frage ist aber auch, ob man wirklich den 6532 verwenden will. Falls man die gewonnen Erkenntnisse auf einen Apple 2 übertragen wollte, ginge das nicht, weil der diesen Chip nicht hat. Außerdem ist dieser Chip für den Bau eines echten Retro-Computers kaum zu bekommen.
Christoph M. schrieb: > Die Frage ist, ob die Auflösung des 6532 eine genügend granulare > Frequenz für die Rechtecktonerzeugung hergibt. Wenn Du über den Timerinterrupt gehen willst, ist dessen Quelltakt offensichtlich der Systemtakt (hier: 1 MHz). Als Vorteiler kann 1, 8, 64 oder 1024 verwendet werden, und der Timer selbst ist ein 8-Bit-Timer. Der steuert allerdings keinen I/O-Pin, sondern nur die Interruptleitung an, d.h. man muss für Timingbetrachtungen auch noch den Overhead eines Interruptaufrufs berücksichtigen. > Die Frage ist aber auch, ob man wirklich den 6532 verwenden will. Da der im vorliegenden Computer drinsteckt, warum nicht? Es geht dem Threadstarter darum, seine Programmierübungen auf dem Gerät zu machen, was er hat, nicht, sich Gedanken um irgendwelche anderen Computer zu machen.
Klaus schrieb: > Auch wenn ich befürchte, dass du die Analogie nicht verstehst: > > Nehmen wir an, du musst 1000 Sekunden warten, kannst aber nur bis 100 > zählen. > Ist es dann egal ob du 10 mal 100 Sekunden wartest oder 100 mal 10 > Sekunden? Hallo Klaus, hier ist es mir wichtig, ein extra Dankeschön zu sagen. Und Danke an alle. Also spielt es keine Rolle ob gerade das X- oder Y-Register herunterzählt. Inzwichen habe ich auch gelesen, dass durch Lesen eines Bytes eine ausreichende Genauigkeit erreicht werden kann. Bei einer Frequenz von 49 Hz als G und 6 Wellen dazu sind 55 Hz als A. Das entspricht ungefähr der 6er Wurzel aus 2. Das ist ein Abstand von einem ganzen Ton. Erdachte mir aber noch einen Lösungsweg. Ich fange ganz oben an abzuzählen bei eine ganz Hohe Frequenz. Dann mache ich eine Liste dieser Frequenzen, wenn die passenden "f" dabei sind wird vielfach mit dem Faktor 2 heruntergeteilt, biss ich in dem passenden Bereich bin. Übrigens, das mit G und A, gibt es auch so ähnlich, zwichen Fis und G, hierbei handelt es sich ungefähr um die 12er Wurzel aus 2. Liebe Grüße Günter K. (ENK) PS.: Ich bekomme gleich Besuch, Wenn ich die Zahlen ausgerchnet habe, komme ich auch nochmal auf das Fis und G und A zurück; hat aber nicht direkt was mit dem Herunterzälen zu tun, sondern nur indirekt. - Bis später.
Harald K. (kirnbichler) 05.05.2025 08:10
>Wenn Du über den Timerinterrupt gehen willst ..
Danke für den Hinweis.
Ich versuche gerade herauszukriegen, wie der Timer im 6532 genau
funktioniert.
Wenn ich es richtig verstehe (Anhang), sollte das Schreiben eines
Start-Bytes auf Base-Adresse + 0x17 den Vorteiler auf 1024 setzten,
Interrupts "disablen". Danach zählt der Timer vom Startwert aus
herunter.
Witzig an dieser historischen Technik ist, dass der Vorteiler über die
Adressierung gesetzt wird, dass spart ziemlich Zeit.
Liege ich mit meinen Annahmen richtig?
Günter K. schrieb: > Wenn ich die Zahlen ausgerchnet habe, Die passenden Zahlen für die Verzögerungsschleife für eine ganze Tonleiter sind bereits im Beitrag Beitrag "Re: Einfache CPU, einfacher Rechner, nur zum Lernen, Erfahrung?" enthalten, kein Grund die neu zu berechnen.
Klaus schrieb: > Günter K. schrieb: >> Wenn ich die Zahlen ausgerchnet habe, > > Die passenden Zahlen für die Verzögerungsschleife für eine ganze > Tonleiter sind bereits im Beitrag > > Beitrag "Re: Einfache CPU, einfacher Rechner, nur zum Lernen, Erfahrung?" > > enthalten, kein Grund die neu zu berechnen. Man findet die Werte auch in dem oben verlinkten Buch. Zusammen mit der Musterlösung zum Einlesen der Klaviatur und zur Tonerzeugung. Aber durch Abtippen lernt man nichts, da ist selbermachen sinnvoller.
Christoph M. schrieb: > Harald K. (kirnbichler) 05.05.2025 08:10 > >>Wenn Du über den Timerinterrupt gehen willst .. > > Danke für den Hinweis. > > Ich versuche gerade herauszukriegen, wie der Timer im 6532 genau > funktioniert. Wenn Du Interesse hast, das Junior Buch Band 2, hat ein komplettes Kapitel fuer die 6532. hier: http://retro.hansotten.nl/uploads/junior/books/de/JuniorComputer_book_02.pdf Seite 33 bis 99. Ich habe die vier Elektor-Buecher in den 1980'er gekauft, n-mal umgezogen (n > 5), aber so haeufig wie in den letzten zwei - drei Monaten habe ich die nie benutzt! Gruesse Th. P.S.: Interrupt war wohl fuer Elektor nicht so spannend (oder zu kompliziert), sowohl bei der 6502 als auch bei der z80 (die ein deutlich besseres Konzept hat) wurde der Interrupt nie benutzt.
:
Bearbeitet durch User
Thomas W. (datenreisender) 05.05.2025 21:06 >Wenn Du Interesse hast, das Junior Buch Band 2, hat ein komplettes >Kapitel fuer die 6532. >hier: >http://retro.hansotten.nl/uploads/junior/books/de/... >P.S.: Interrupt war wohl fuer Elektor nicht so spannend (oder zu >kompliziert), sowohl bei der 6502 als auch bei der z80 (die ein deutlich >besseres Konzept hat) wurde der Interrupt nie benutzt. Für heutige Verhältnisse scheint mir das Timer-Modul etwas umständlich erklärt. Aber ab Seite 77 hat der Autor tatsächlich Interrupts in Verwendung (Allerdings auch ziemlich aufwändig ..).
Günter K. schrieb: > Ich fange ganz oben an abzuzählen bei eine ganz Hohe Frequenz. > Dann mache ich eine Liste dieser Frequenzen, wenn die passenden "f" > dabei sind wird vielfach mit dem Faktor 2 heruntergeteilt, > biss ich in dem passenden Bereich bin. > Übrigens, das mit G und A, gibt es auch so ähnlich, zwichen Fis und G, > hierbei handelt es sich ungefähr um die 12er Wurzel aus 2. Mann kann sich natürlich alles völlig von Null erarbeiten. Dann wird man halt nie fertig bzw. kommt nie zur eigentlichen Aufgabe. Ich dachte Du willst programmieren lernen, nicht die Grundlagen einer Tonleiter herleiten. Mein Vorgehen wäre deshalb: Ich such mir die Frequenzen der Töne, die ich erzeugen will, kurz über google zusammen. Dauert 10 Sekunden. Beispiel für die Note C4: C4 = 261,626 Hz, entspricht einer Periodendauer von 1/261 = 3822us. Wir brauchen aber die halbe Periodendauer (jeweils mit Ausgang 0 bzw. 1), also 3822 = 1911 us. Solange muss man warten, bis der Ausgang umgeschaltet wird. Die einfache Verzögerungsschleife braucht 5 Taktzyklen = 5us pro Wert, also muss die Schleife 1911us/5us = 382mal durchlaufen werden. Weil 382 größer ist als 255 (die mit 8 Bit größte darstellbare Zahl), muss man sich etwas einfallen lassen. Im Progrämmchen von Christoph oben wird die Verzögerungsroutine halt 2 mal aufgerufen, einmal mit 180 und einman mit 200. Die Summe 380 ist noch exakter als meine oben berechneten 382, weil es auch noch feste Verzögerungen im Programmablauf gibt. Aber das sind Feinheiten, die am Anfang überhaupt nicht interessieren. Genausogut könnte man sich eine Verzögerungsschleife überlegen, die länger als 5us braucht, z.B. 10us. Dann muss man sie nur mit dem Wert 382/2=191 aufrufen, was wieder mit einem einfachen Zähler geht. Oder man nimmt halt eine veschachtelte Schleife mit 2 Zahlen, also 2x191, 4x95, 8x48 oder was einem beliebt und möglichst genau 382 ergbit. Das ist halt die komplizierteste Variante.
Klaus schrieb: Günter K. schrieb im folgenden Text: > Nimmt man die 49 Hz, dann ist das G1, zähle ich noch 5 Wellen dazu, dann >> habe ich mit den 55 Hz das A1. Nimmt man die 55 Hz mal 4 multipliziert >> ergibt 440 Hz. Da habe ich mich vertippt, ich meinte aber: "Nimmt man die 49 Hz, dann ist das G1, zähle ich noch 6 Wellen dazu, dann habe ich mit den 55 Hz das A1. Nimmt man die 55 Hz mal 4 multipliziert ergibt 440 Hz." von Soul E. (soul_eye)schrieb am 05.05.2025 um 19:48 : "Aber durch Abtippen lernt man nichts, da ist selbermachen sinnvoller." Günter K. schreibt: Hallo, und Danke für die Antwort. Ich muss mich noch mehr damit befassen; so, dass ich es selber machen und verstehen kann. In diesem Falle, die Werte in dem Y- und X-Register in Bezugnahme auf Wellenlänge und Frequenz. Bitte hierauf noch nicht antworten. Ich muss mich selber genug damit beschäftigen, damit ich es verstehe. - Falls ich danach, immer noch nicht verstanden habe, danach melde ich mich evtl. noch mal mit Fragen. Bis jetzt habe ich es noch nicht richtig genug verstanden. Liebe Grüße Grüße Günter Ja, (ENK)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.