← ST-Computer 10 / 1992

Quick-Tips

Grundlagen

Alter AT-Speed im neuen STE

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

DR LOGO lebt!

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

Sequenzer leicht gemacht

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

Ergänzung zum Memory-Manager (in C) aus dem Programmierpraxis-Sonderheft

Zwei Verbesserungen erreichten uns vom Autor:

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

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