Wenn Sie beim Erwerb des STE den MSDOS-Emulator AT SPEED (nicht CI6!) vom ST hinübergerettet haben, werden Sie sich sicher häufig geärgert haben, daß sich das Programm schon beim Start aufhängt. Ursache ist, daß der AT-Speed nicht unter dem 16MHz-Starttakt des STE läuft. Nun ist es sicher möglich, mal in das Kontrollfeld zu gehen und dort den Takt umzustellen. Aber das fällt mir natürlich immer erst wieder ein, wenn ich schon zum RESET-Knopf greifen muß.
Das kleine Programm tut nun nichts anderes, als die Frequenz auf 8 MHz ohne Cache umzuschalten, den AT-Speed nachzuladen und zu starten. Die Rückkorrektur erfolgt nicht, da man nach dem Verlassen der MS-DOS-Ebene ohnehin einen Neustart des Rechners durchführt. ATSTART schieben Sie am besten mit einem Icon MS-DOS auf das Desktop.
Von dem vielzitierten dicken schwarzen Buch wird man hier arg im Stich gelassen. Erfolg hatte ich erst, nachdem ich die General.CPX-Datei mit dem Debugger unter die Lupe nahm.
Das Programm enthält noch eine weitere Möglichkeit: Da ich den Emulator nicht täglich brauche, habe ich ihn auf meiner alten, externen Festplatte gelassen. Aus Geräuschgründen läuft die aber nicht immer mit. Sollte sie also nicht eingeschaltet sein, erfolgt eine entsprechende Meldung, und das Programm terminiert ohne etwas weiteres zu tun. Sollten Sie letzeres nicht benötigen, lassen Sie die optionalen Zeilen einfach weg.
B. Volkmer
; stellt Frequenz des MEGA STE auf 8 MHz
; und startet den AT-Speed
; falls FP-Drives ab G nicht da sind,
; erfolgt Warnung und Terminierung
; B.Volkmer Wilhelmshaven 7/1992
; (c)1992 by MAXON-Computer
TEXT
SCU EQU $FF8E21
start: bra beginn
korr: ; im Supervisormodus
movea.l #$FF8E21,A0 ; Takt auslesen
move.b (A0),D0 ; Byte holen
andi.b #$FC,D0 ; Byte 0,1 löschen
move.b D0,(A0) ; und einschreiben
rts
beginn: movea.l SP,A5 ; wo sind wir denn
movea.l 4(A5),A5 ; die BasePage
move.l 12(A5),D0 ; das Textsegment
add.l $14(A5),D0 ; das Datasegment dazu
add.l $1C(A5),D0 ; und das BSS-Segment dazu
addi.l #$0200,D0 ; Platz für Stack dazu
move.1 D0,D1 ;
add.l A5,D1 ; Länge + Basepage
andi.l #-2,D1 ; Stack gerade machen
movea.l D1,SP ; ablegen
move.l D0,-(SP) ; Größe der Reservierung
move.l A5,-(SP) ; ab wo zu reservieren
clr.w -(SP) ; 0, weils TOS so will
move.w #$4A,-(SP) ; SetBlockFunktion
trap #1 ; Gemdos, MShrink
adda.l #12,SP ; Stack korrigieren
; Optionale Festplattenabfrage
move.w #10,-(SP) ; ext HD abfragen
trap #13
addq.l #2,SP
cmpi.l #$64,D0 ; ext HD ab Drive H
bpl istok ; => 64 ist ok
pea str ; Meldung ausgeben
move.w #9,-(SP)
trap #1
addq.l #6,SP
lp: move.w #2,-(SP) ; auf Taste warten
move.w #1,-(SP)
trap #13
addq.l #4,SP
tst.w D0 ; D0 muß -1 sein
beq lp
clr.w -(SP) ; Programm terminieren
trap #1
; hier ohne Festplatten-Abfrage weitermachen
istok:
pea korr(PC) ; Super ausführen
move.w #38,-(SP)
trap #14
addq.l #6,SP
SPEED: pea env ; für ATSPEED
pea com
pea filn ; Pfad des Speed
move.w #0,-(SP)
move.w #$4B,-(SP) ; PExec
trap #1 ; ATSPEED wird Hausherr
adda.l #16,SP
warnix: move.w #0,-(SP) ;nur im Fehlerfalle
trap #1
; abbruch -> Desktop
DATA
; da liegt mein AT-Speed
filn: DC.B "C:\SPEED\AT_SPEED.PRG",0
; Optional
str: DC.B 10,13,"Für MS-Dos bitte FPlatte 2 einschalten !",10,13
DC.B "Taste zum Beenden drücken",10,13,0
EVEN
com: DC.W 0
env: DC.W 0
END
Als das DR LOGO von Atari nach dem Einbau von TOS 1.4 unbrauchbar war, weil man keine Programme laden konnte, habe ich mich mit einem Debugger auf den Weg gemacht, die Ursache aufzuspüren.
Schon bald war das Problem gefunden: Anscheinend, um eine Speicherfragmentierung zu verhindern, alloziert LOGO allen verfügbaren Speicher, bevor es sein Mshrink() ausführt. Dies geht soweit, daß nach dem Allozieren des größten freien Speicherblocks solange weitere Blöcke alloziert werden, bis Malloc(-1) Null zurück liefert. Bei TOS-Versionen kleiner 1.4 scheint dies problemlos zu funktionieren.
Nicht so ab TOS 1.4. Da das GEM aber beim Öffnen der Fileselectorbox auch Speicher allozieren muß und keinen vorfindet, wird eine Fehlermeldung ausgegeben. Dies führt dazu, daß keine Files mehr geladen werden können und LOGO somit praktisch unbrauchbar geworden ist.
Der folgende Patch in GFA-BASIC behebt das Problem, indem die überflüssigen Malloc()-Aufrufe einfach entfernt werden. Man sollte den Patch natürlich zuerst an einer Kopie probieren, aber bisher sind keine Nebeneffekte bekannt geworden.
J. Willamowius, Hamburg 54
' Patcht DR LOGO für TOS 1.4
' Autor: Jan Willamowius
' (c)1992 by MAXON-Computer
OPEN "U",#1, "LOGO.PRG"
SEEK #1,&H5C
IF INP(#1)=&H4E THEN
@patch(&H5C,&H4A7 9)
@patch(&H62,&H4E71)
@patch(&H64,&H4E71)
@patch(&H66,&H4E71)
@patch(&H68,&H4A79)
@patch(&H6E,&H4E71)
@patch(&H70,&H4E71)
ELSE
PRINT "Falsche oder schon gepatchte Version!"
ENDIF
CLOSE #1
PROCEDURE patch(ort%,inhalt%)
SEEK #1,ort%
OUT #1,inhalt% DIV &H100
OUT #1,inhalt% MOD &H100
RETURN
Hier mein Beitrag zur kleinen Reihe „Software-Sequenzer für GFA-BASIC 3 in 24 Zeilen“. Es ist erstaunlich, wie leicht ein Sequenzer tatsächlich zu realisieren ist. Man speichert ankommende Midi-Nachrichten mit der zugehörigen Zeit und spielt sie anschließend wieder ab. Der Clou: Sogar System-Exclusive-Daten können übertragen werden. Das Programm ist schnell genug, um im Interpreter zu arbeiten. Benutzung: Nach dem Start des Programmes Midi-Nachrichten auf Keyboard/WasweißichfüreineMidiquelle einspielen; ein Druck auf die Leertaste bringt es wieder zu Gehör.
Der Q-Tip (wenn ich ihn überhaupt so nennen darf) für alle GFA-Midi-Programmierer: Lesen Sie niemals Daten mit INP(3) aus, das ist zu langsam, benutzen Sie INPMID$ und lesen Sie die Daten dann einzeln aus dem String aus. Natürlich ist dies nur ein Grundgerüst, um das man sich seinen Sequenzer bauen kann. Interessierte sollten auf die ST-Computer-PD-Serie achten: Ein Programm, das im Prinzip dieses Gerüst verwendet, wird bald folgen. Oder wenden Sie sich vertrauensvoll an mich.
R. E. Watzlawik
Zwei Verbesserungen erreichten uns vom Autor:
Bei der Rückgabe von Speicherblöcken kann es auf einem TT zu Problemen kommen, wenn der Speicherverwaltungskopf im TT-RAM liegt, der zu verwaltende Block jedoch im ST-RAM. Die Rückgabe scheitert dann und der Speicher wird zügig knapp. Zur Abhilfe muß in der Funktion insert_into_list lediglich die dritte Plausibilitätsbedingung entfernt oder auskommentiert werden:
... if (((following != NULL) /* Plausibilitätskontrolle */ && ((MEM_BLOCK *) ((char *) block + size) > following)) || (size < (long) sizeof(MEM_BLOCK)) || ((char *) block < start_of_buffer) || ((char *) block + size > end_of_buffer)) ...
Die Funktion coreleft liefert nicht den korrekten Wert, wenn der letzte in der Verkettung der freien Blöcke auch der größte ist. Zur Korrektur müssen die folgenden Zeilen geändert werden:
... block = (&head)->next; while (block != NULL) ...
H.-J. Richstein