Forum: Mikrocontroller und Digitale Elektronik Einfache CPU, einfacher Rechner, nur zum Lernen, Erfahrung?


von Thomas W. (datenreisender)


Lesenswert?

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
von Günter K. (enk)


Lesenswert?

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.

von Thomas W. (datenreisender)


Lesenswert?

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
von Christoph M. (mchris)


Lesenswert?

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.

von Re (r42)


Lesenswert?

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)

von Christoph M. (mchris)


Lesenswert?

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?

von Christoph M. (mchris)


Angehängte Dateien:

Lesenswert?

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.

von Re (r42)


Lesenswert?

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)

von Klaus (feelfree)


Lesenswert?

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.

von Thomas W. (datenreisender)


Lesenswert?

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.

von Josef G. (bome) Benutzerseite


Lesenswert?

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.

von Günter K. (enk)


Lesenswert?

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)

von Klaus (feelfree)


Lesenswert?

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!

von Harald K. (kirnbichler)


Angehängte Dateien:

Lesenswert?

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.

von Christoph M. (mchris)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

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.

von Günter K. (enk)


Lesenswert?

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.

von Christoph M. (mchris)


Angehängte Dateien:

Lesenswert?

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?

von Klaus (feelfree)


Lesenswert?

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.

von Soul E. (soul_eye)


Lesenswert?

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.

von Thomas W. (datenreisender)


Lesenswert?

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
von Christoph M. (mchris)


Lesenswert?

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 ..).

von Klaus (feelfree)


Lesenswert?

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.

von Günter K. (enk)


Lesenswert?

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
Noch kein Account? Hier anmelden.