Quick-Tips

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


Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]