Hallo liebe C-64 Gemeinde!
Ich verstehe etwas Assembler-Programmierung, aber trotzdem tauchen bei mir einiger Verständnisfragen auf. Ist der folgende Assemblercode auch in Basic umsetzbar?
Natürlich spielt erst mal die Geschwindigkeit erst mal keine Rolle. Es geht um die Ansteuerung eines Roland MPU-401 Interface. Es ist ein Midi-Interface, das mit Hilfe eines Interface über den Expansionsport mit dem C-64 angesteuert werden kann. Ich habe mir bezüglich ein pdf-Handbuch downgeladen in dem einige Assemblerprogramme als Beispiel aufgeführt werden. Zum Beispiel soll die folgende Routine einen Befehl an die Roland - MPU schicken nach folgenden Prinzip :
1. [tt]test DRR (bit 6) of STATPORT.
2. [tt]if bit 6 = 1, then goto step 1.
3. [tt]disable interrupts.
4. send command to COMPORT of the MPU-401.
5. test DSR (bit 7) of STATPORT.
6. if bit 7 = 1, then goto step 5.
7. read DATAPORT.
8. if data = acknowledge ($FE), then step 9. else no acknowledge. so:
a. all interrupt service routine. using software interrupt (machine dependent).
b. goto step 5.
9. enable interrupts.
10. return to caller
Habe ich das richtig verstanden, dass beim Punkt 8 a ein entsprechender eigender Software Interrupt umgesetzt werden muss. Im konkreten Fall für den C-64?
Wenn man das jetzt in Assember umsetzen will, dann wäre das ja dieser Assember-Code:
DATAPORT equ $C080+no; n=slot
COMPORT equ $C081+n0; n=slot
STATPORT equ $C081+n0; n=slot
Ist das jetzt ein Fehler, dass die Adressen vom Comport und Statport identisch sind. Was bedeuten die slots? Sind damit die Adressen des C-64-User-Ports gemeint?
DSR: equ $80
DRR: equ $40
TEMP ds 1
combfr ds 1
ack equ $FE
int1 equ fixed_entry ; in the section 8 ; send command thru combfr
Sn.Cmd: lda STATPORT; get status
and #DRR; test bit 6
bne Sn.Cmd; if bit 6 = 1 then keep tryiing
sei; mask interrup
lda combfr; get comand
sta COMPORT; send to the MPU-401
in Basic würde ich diesen Teil jetzt so umsetzen wollen:
10 DATAP = 49280 [ Ich weiss natürlich nicht, was diese slots zu bedeuten haben. Die Adressen des C-64 Expasionsports?. Die müssen ja dann anscheinend noch zu den Wert hinzuaddiert werden ]
20 COMP = 49281
30 st = Peek (COMP)
Ich wüsste jetzt nicht, wie ich das Bit 6 in Basic testen könnte. Eine Idee wäre, dass ich mit Hilfe von AND das Bit maskiere und anschließend prüfe, ob es 1 ist.
40 bit = st AND 32
50 if bit = 32 THEN GOTO 40
60 ? Wie kann ich von Basic aus den Interrup maskieren?
70 com = 1
80 Poke COMP,com
Bin ich da auf den richtigen Weg? Oder, ist das Blödsinn
Der Assemblercode geht noch weiter, aber wäre die erste Basic-Umsetzung schon ok?
VG