Ich glaube, ich habe eine Möglichkeit zum Auslesen des Betriebssystems der Micro entdeckt. Damit würden natürlich auch die künstlichen Einschränkungen bei der Assemblerprogrammierung fallen.
Der Systemtreiber page0_ext1.s19 erweitert die Micro unter anderem um die Dateifunktionen OPEN#, PRINT# und INPUT#. Durch Auslesen mittels INPUT# kann der Flashspeicher des Kontrollers ausgelesen werden. Theoretisch würde es ausreichen, kontinuierlich Daten aus der Datei zu lesen: Am Ende des 64-kB-Adreßraums läuft der Zeiger über und auf diese Weise kann der gesamte Speicher ausgelesen werden. Dummerweise hat der Entwickler der C-Control an diesen Fall gedacht und einen Überlauf bei $fc00 abgefangen. Aber es dürfte möglich sein, den 16-Bit-Dateizeiger (auf Adresse $80) nach dem Öffnen der Datei durch Aufruf von SYS &hfdd9 gezielt zu inkrementieren. Damit könnte man also den Zeiger zunächst überlaufen lassen und anschließend mit INPUT# den Speicher ab Beginn auslesen.
Hier der entsprechende Ausschnitt aus dem Systemtreiber:
; ----------------------------------------------------------------------------
; Die Funktionen zum Datei-Handling (Funktionsnummer #$d2)
; Auf $80:$81 steht der Dateizeiger
fdbd : cdf0d2 jsr $f0d2 ; ins Betriebssystem, verm. nächstes Token holen
fdc0 : a302 cmpx #$02 ; OPEN# FOR READ/WRITE-Token
fdc2 : 232a bls $fdee ; branch if accu is lower or same (unsigned)
fdc4 : b680 lda $80 ;
fdc6 : a1fc cmp #$fc ; Überlauf abfangen
fdc8 : 222e bhi $fdf8 ;
fdca : a305 cmpx #$05 ; PRINT#-Token
fdcc : 2713 beq $fde1 ; branch if equal (Z is set)
fdce : a306 cmpx #$06 ; INPUT#-Token
fdd0 : 2626 bne $fdf8 ; branch if not equal (Z is clear)
fdd2 : 5580 ldhx $80 ; 6808: Load H:X from M
fdd4 : f6 lda ,x ; load accu with value at address in h:x
fdd5 : 8c clrh ; 6808: Clear H
fdd6 : cdf167 jsr $f167 ; ins Betriebssystem, verm. Wert auf Stack pushen
fdd9 : 3c81 inc $81 ;
fddb : 261b bne $fdf8 ; Dateizeiger inkrementieren
fddd : 3c80 inc $80 ;
fddf : 2017 bra $fdf8 ; branch always to $fdf8
fde1 : cdf0eb jsr $f0eb ; ins Betriebssystem
fde4 : 3c93 inc $93 ;
fde6 : 9b sei ; set interrupt mask (disable interrupts)
fde7 : cdf457 jsr $f457 ; ins Betriebssystem
fdea : 8c clrh ; 6808: Clear H
fdeb : 9a cli ; clear interrupt mask (enable interrupts)
fdec : 200a bra $fdf8 ; branch always to $fdf8
fdee : c6ffb5 lda $ffb5 ; im 14-Byte-Flash
fdf1 : b781 sta $81 ; store accumulator at address $81
fdf3 : c6ffb4 lda $ffb4 ; im 14-Byte-Flash
fdf6 : b780 sta $80 ; store accumulator at address $80
fdf8 : ccf21d jmp $f21d ; ins Betriebssystem
Ich habe leider noch keine passende Micro. Kann das jemand überprüfen, der die Micro in der Version 2.01 besitzt? Angeblich ist der Treiber nicht für die Micro mit der OS-Version 2.00 geeignet...
|