Quick-Tips

PHOENIX 1.5

Mir war das Suchen nach den Tabellen in dem winzigen Fenster am linken Bildrand zu mühsam, und so strickte ich mir mein eigenes "Klick-Menü" wie folgt:

Im Designer 1. eine Tabelle "Menü" erstellen, 2. darin ein "Dummy"-Feld (z.B. Datum) anlegen, dann 3. eine Maske für "Menü" schaffen und mit Aktionsknöpfen vollpacken, z.B. für Verzweigungen in andere Tabellen, Standardabfragen, Reports ausgeben oder Felder-Import/Export.

Vielleicht gibt es auch bald eine Version von PHOENIX, die es erlaubt, Batches (automatische Befehlsabarbeitung) per Aktionsknopf auszuführen. Dann wird mein Traum wohl in Erfüllung gehen, eine Abfrage und anschließendes Ausführen eines Reports mit den gefundenen Datensätzen und Import/ Export ganzer Tabellen (und nicht nur Feldern) per Mausklick erledigen zu können.

Level 10 bei OXYD-II

Das Spiel OXYD-II berechnet die Level-Codes anhand eines Zählers im Level 10. Das bedeutet, daß Level-Codes nicht mehr akzeptiert werden, wenn man das Level 10 öfter spielt. Im Prinzip ist das ja nicht so schlimm, und Meinolf Schneider weist in seinem Handbuch zu OXYD-II auch darauf hin, daß man unbedingt eine Sicherheitskopie von dem Programm machen und nur mit dieser Kopie spielen soll.

Jetzt stelle man sich aber einmal folgende Situation vor: Man spielt z.B. bis zu Level 57. Dann kommt ein Freund vorbei und kommt mit einer Ebene vor Level 11 nicht klar. Natürlich ist man dann so freundlich und zeigt ihm, wie es geht. Und so spielt man dann weiter, bis man Level 10 erneut durchgespielt hat, und schon ist es passiert: Die mühsam erspielten Codes ab dem Level 11 werden alle nicht mehr von OXYD-II akzeptiert, da der Level-10-Zähler nun einen anderen Inhalt hatte als zu dem Zeitpunkt, zu dem man die Level-Codes erspielt hat. Und genau hier setzt mein Programm an. Es setzt den Level-10-Zähler von OXYD-II auf einen definierten Wert (1) zurück, und man kann seine alten Codes weiterverwenden. Was passiert aber, wenn jemand Level 10 öfter gespielt hat?

Nun, in diesem Fall kann er seinen aktuellen Level-10-Stand mit diesem Programm erfragen und die Werte an der im Listing markierten Stelle einsetzen. Dieses muß aber auch vor einem erneuten Spielen des Levels 10 erfolgen, da die Level-Codes sonst auch hinfälig sind. Bitte wenden Sie dieses Programm nur auf eine Kopie von OXYD-II an, falls beim Patchen etwas schief geht Nun wünsche ich Ihnen wieder viel Spaß beim Spielen von OXYD-II. (Übrigens: Die lauffähige Version des Programms finden Sie auf der Monatsdivkette zum Heft: "QUICKTIP OXYDPATC.PRG".)

' *     Level-10-Patch für OXYD2     *
' * (c) 12/91 Peter Hilbring         *
' * geschrieben in GfA-Basic V3.06   *
FILESELECT #"Wo ist OXYD2.PRG ?","\*.PRG","",file$
IF file$

"" AND EXIST(file$) THEN
  alert$=" 
 
 Patche "+RIGHT$(file$,RINSTR (file$,"\"))
  ALERT 1,alert$,1," OK 
 Abbruch ",d%
  IF d%=l THEN
    OPEN "U",#l,file$
    IF LOF(#l)

&HAD4D0 THEN
      alert$=" Falsche OXYD2-Version, 
 Die Datei ist nicht"
      alert$=alert$+" 
 709840 Bytes lang. "
      ALERT 3,alert$,l," Schade ",d%
    ELSE
      SEEK #l,&H1F5B6
      alert$=" Level-10-Zähler steht auf : 
 1.Byte : &H"+HEX$(INP(#1) )
      alert$=alert$+" l 2.Byte : &H"+HEX$(INP (#1))+" 
 Wirklich patchen ? "
      ALERT 1,alert$,1," Ja 
 Nein ",d%
      IF d%=1 THEN
        SEEK #1,&H1F5B6
        ' An dieser Stelle wird der Level-10-Zähler auf "1" gesetzt
        ' Sie können hier Ihre eigenen Werte (siehe Alertbox) einsetzen
        OUT #1,&H9D   ! 1.Byte Level-10-Zähler
        OUT #1,&H0    ! 2.Byte Level-10-Zähler
      ENDIF
    ENDIF
    CLOSE #1
  ENDIF
ENDIF

Bessere Boot-Verzögerung für MEGA STE

Im MEGA STE ist nach einem Kaltstart eine Warteschleife von ca. 90 Sekunden vorgesehen, damit die Festplatte Zeit hat, auf Touren zu kommen. Offensichtlich war Atari schon klar, daß das sehr reichlich ist. Daher kann man diese Schleife durch Drücken einer Taste vorzeitig beenden. Bequeme Leute können sich diese Arbeit nun abnehmen lassen. Das vorgestellte Programm schreibt in den Boot-Sektor einer beliebigen Diskette im Laufwerk A: eine Routine, die nach einem Kaltstart eine vorgegebene Zeit wartet und dann einen Tastendruck simuliert, indem einfach der Schreibzeiger in „Iorec“ hochgezählt wird. Durch Betätigen einer Taste kann auch dieser Vorgang abgebrochen werden. Im Installationsprogramm besteht die Möglichkeit, die voreingestellte Zeit zu ändern. Aber Vorsicht, es erfolgt keine Fehlerkontrolle. Die Standardzeit von 15 Sekunden ist bei mir genau richtig. Drückt man nur Return, bleibt sie erhalten.

Andere Einschaltverzögerer arbeiten auf dem MEGA STE nicht richtig, da sie nach Ablauf der Zeit nur einen Warmstart auslösen. Auf älteren Rechnern funktioniert das auch, so daß das System mit Platte hochfährt. Auf dem neuen jedoch wird die Warteschleife nicht beeinflußt. Man muß daher weiter warten und kommt um den Tastendruck nicht herum. (Übrigens: Die lauffähige Version des Programms finden Sie auf der Monatsdiskette zum Heft: „WAIT.PRG“.)

J. Starzynski, O-2500 Rostock

;Bootverzögerer für MEGA STE 
;erstellt mit TURBOASS V 1.07 
;von J. Starzynski 1992

        pea mes(PC)             ;aufforderung zur
        move.w #9,-(SP)         ;Zahleneingabe
        trap #1 
        addq.l #6,SP 
empty:  move.w #11,-(SP)        ;in schleife
                                ;tastaturpuffer 
                                ;leeren
        trap #1                 ;Cconis
        addq.l #2,SP 
        tst.w D0
        beq.s re_time           ;kein weiteres
                                ;Zeichen
        move.w #1,-(SP)         ;Zeichen einlesen
        trap #1                 ;Cconin
        addq.l #2,SP 
        bra.s empty 
re_time:pea puf(PC)             ;zeit lesen
        move.w #10,-(SP)        ;Cconrs
        trap #1 
        addq.l #6,SP
        move.b puf+1(PC),D0     ;anzahl der
                                ;Zeichen holen 
        beq.s read              ;gleich enter
                                ;gedrückt -> 
                                ;Standard lassen 
        move.b puf+3(PC),time+1 ;Einer holen 
        move.b #'0',time        ;zunächst 0 für
                                ;Zehner nehmen 
        subq.b #2,D0            ;2 Zeichen
                                ;eingegeben? 
        bcs.s read              ;nein
        move.b puf+2(PC),time   ;Zehner holen 
read:   clr.w -(SP)             ;fertigmachen für
                                ;rwabs
        clr.w -(SP)             ;bootsektor lesen
        move.w #1,-(SP) 
        pea buf
        move.w #2,-(SP)
        move.w #4,-(SP)
        trap #13                ;rwabs
        lea 14(SP),SP
        tst.w D0                ;fehler?
        bne.s error
        move.w #$6038,buf       ;sprung zum code
                                ;eintragen 
        lea buf+$3A,A0          ;begin des codes
        ;im bootsektor          ;als ziel 
        lea boot (PC),A1        ;bootcode als
                                ;quelle
        move.w #(fin-boot-1),D0 ;prglen-1 für ; dbra
        cmp.w #511-$39,D0       ;code zu lang?
        bcc.s error             ;ja
loop:   move.b (A1)+,(A0)+      ;alles kopieren
        dbra D0,loop
        move.w #1,-(SP)         ;protobt:
        move.w #-1,-(SP)        ;ausführbaren
        pea —1.w                ;bootsektor
        pea buf                 ;erzeugen
        move.w #18,-(SP)        ;alles andere
                                ;unverändert 
        trap #14                ;protobt
        lea 14(SP),SP
        clr.w -(SP)             ;rwabs bootsektor
        clr.w -(SP)             ;schreiben
        move.w #1,-(SP) 
        pea buf
        move.w #3,-(SP)
        move.w #4,-(SP)
        trap #13                ;rwabs
        lea 14(SP),SP
        bra.s ende              ;fertig
error:  pea err(PC)             ;fehler
        move.w #9,-(SP)         ;aufgetreten
        trap #1                 ;meldung ausgeben
        addq.l #6,SP
        move.w #8,-(SP)
        trap #1                 ;taste
        addq.l #2,SP
ende:   clr.w -(SP)             ;tschüss
        trap #1

;beginn des bootcodes
boot:   movem.l D0-A6,-(SP)     ;register sichern
        tst.w $0446.w           ;bootdevice != A: ?
        bne.s put               ;ja->kein
                                ;Kaltstart 
        pea message(PC)         ;meldung
        move.w #9,-(SP) 
        trap #1 
        addq.l #6,SP
        lea time (PC),A6        ;Sekunden holen
        moveq #0,D5             ;aus ascii in bin
        moveq #0,D6             ;umrechnen
        move.b time(PC),D5
        sub.b #'0',D5
        move.b time+1(PC),D6
        sub.b #'0',D6
        mulu #10,D5
        add.w D6,D5             ;zeit in d5
bloop:  move.l $04BA,D0         ;hz_200-zähler
        divu #200,D0            ;umrechnen in sek
        sub.w D5,D0             ;differenz zu
                                ;Vorgabezeit 
        bpl.s reset             ;überschritten
        neg.w D0                ;Vorzeichen war
                                ;negativ
        ext.l D0                ;erweitern
        divs #10,D0             ;in Ziffern
                                ;zerlegen 
        add.b #'0',D0           ;und in ascii
                                ;umrechnen
        move.b D0,(A6)          ;in string
                                ;eintragen 
        swap D0                 ;divisionsrest
                                ;steht im highword
        add.b #'01,D0 
        move.b D0,1(A6)
        pea out (PC)            ;restzeit ausgeben
        move.w #9,-(SP) 
        trap #1
        move.w #11,(SP)
        trap #1                 ;Cconis: taste
        addq.l #6,SP            ;gedrückt?
        tst.w D0
        beq.s bloop             ;nein, weiter
                                ;schleife
        bra.s put
reset:  move.w #$0202,$0446.w   ;boot_dev umsetzen
put:    pea $OE0001
        trap #14                ;Iorec
        addg.l #4,SP 
        movea.l D0,A0
        addq.w #4,6(A0)         ;Schreibzeiger
                                ;inkrementieren 
        movem.l (SP)+,D0-A6     ;weiter im 
        rts                     ;bootablauf

out:    DC.B 13,'noch: '
time:   DC.B '15 sek',0
message:DC.B 'Warten auf Festplatte, Abbruch mit' 
        DC.B ' beliebiger Taste',10,13 
        DC.B 27,'p',189,' J. Starzynski 1992 ' 
        DC.B 'Version 1.0 ',27,'q',13,10 
        DC.B ‘count down',10,0

fin:    ;           ENDE des bootsektors
err:    DC.B "Fehler aufgetreten!!!",13,10,0
mes:    DC.B 27,'EBitte Bootdiskette einlegen!!!'
        DC.B 13,10
        DC.B 'Gewünschte Wartezeit eingeben ('
        DC.B 'Standard: 15 Sek.):___',8,8,0
puf:    DC.B 2,0,'00 '          ;für Cconrs
        BSS
buf:    DS.B 512                ;puffer für Bootsektor
        END

Und es geht doch: Hardware-Scrolling auf dem ST!

Ganz so komfortabel und schön „pixelweise“ wie beim STE wird es wohl nicht werden, aber immerhin „wortweise“. Dabei ist wichtig zu wissen, daß es möglich ist, den Bildspeicher des ST wortweise zu adressieren. Jeder hardwarenahe Programmierer kennt aber das Problem, daß es beim Video-Base-Register kein Low-Byte gibt.

Als ich nun im AMIGA Intern (ja, Sie haben richtig gelesen) von Bitplane-Adressen erfuhr, die jedesmal im VBI oder mittels Copper gesetzt werden müssen, fiel mir unser Video-Base-Register (VBR) und dessen Zusammenwirken mit dem Video-Adress-Counter (VAC) auf. Nach einigen Experimenten war alles perfekt: Der VAC ($FF8205,07,09) ist entgegen offizieller Dokumentation auch beschreibbar (!), d.h. es läßt sich jederzeit die aktuell bearbeitete Bildspeicheradresse ändern. Das macht vor allem im VBI, HBI und Timer-B Sinn, so daß zeilen- und bildweises Scrollen möglich wird. Bei entsprechender Geschwindigkeit ruckelt es noch nicht einmal. Das kleine Demoprogramm kann der Einfachheit halber nur mit Reset oder Debuggerbreaks gestoppt werden.

F. Goyke, O-2520 Rostock 25

; Hardwarescrolling auf dem ST 
; Autor: Fred Goyke 
; Sprache: TURBOASS V:1.7.2 
; Datum: 26.12.91
;
        pea MAIN(PC)
        move.w  #$26.-(SP) 
        trap    #14
        addq.l  #6,SP
MAIN:
        move    #$2700,SR

        move.l  #VBI_INT,$70.w 
        clr.w   D6

        move    #$2300,SR
wait:
        bra.s   wait
VBI_INT:
        addq.b  #4,D6   ; 2, 4 oder 8 bei
                        ; High-, Med- oder Low-Rez. 
        move.b  D6,$FFFF8209.w ; VAC auf LOW! 
        rts

Hardware-Scrolling mit Großbildemulator?

In der Ausgabe 1/92 der ST-COMPUTER wird ein Großbildschirmemulator für den STE vorgestellt. Der Autor dieses Programms hatte einige Probleme mit dem Hardware-Scrolling des STE in der mittleren und hohen Auflösung. Vor einiger Zeit hatte ich ebenfalls ein solches Programm entwickelt und genau dieselben Probleme. Das Scrolling in der mittleren und hohen Auflösung ist mit einem kleinen Kompromiß möglich, man muß nur verhindern, daß das HSCROLL-Register auf Null gesetzt wird. Falls es beim Scrollen diesen Wert erreichen sollte, setzt man es einfach auf den Wert Eins. Das hat zur Folge, daß die äußerste linke Pixel-Spalte nicht mehr auf dem Bildschirm erscheint, außerdem macht der Mauspfeil einen kleinen Sprung. Außer bei der direkten Textausgabe unter TOS macht sich die fehlende Spalte kaum bemerkbar.

Die Timer-B-Routine kann man vollständig weglassen, in dem man die Bildspeicher adresse nicht in das VBASE- Register einträgt, sondern in die Videozählerregister $FFFF 8205,...07 und...09. Wenn man die Bildadresse im VBL ein trägt, flackert das Bild nicht. Diese Methode schlägt auch ATARI offiziell vor.

D. Hohmann, W-3407 Gleichen Etzenborn

System zum Patchen

Wer hätte nicht gern sein Betriebssystem auf Diskette, um dort dann nach Herzenslust darin zu patchen? Das beigefügte Listing in GFA-BASIC 3.6 (müßte auch in anderen Versionen funktionieren) besorgt das ganz einfach. Es sei noch anzumerken, daß der etwas umständlich wirkende Weg, das ROM byte-weise auszulesen und in einen Zwischenspeicher zu „poken“, notwendig ist, weil sich Interpreter und Compilat beim Versuch, auf das ROM direkt mit „BSAVE“ zuzugreifen, leider verabschieden. Es gibt dann weder Bomben noch Fehlermeldung - nichts geht mehr.

Dr. M. Fricke, W-5300 BonnI

.11100
' ROMREAD.GFA
' Auslesen von TOS aus dem ROM 
' (c) Martin Fricke 12/1991
lang%=262144        ! TOS-Länge in Bytes
!(hier TOS 2.05 für 1.00 bis 1.04 = 196608)
ALERT 1,"Bitte Zieldiskette ohne Schreibschutz in A: einlegen!",1,"OK | Abbruch",bac| 
If bac|=2 
    EDIT 
ENDIF
IF DFREE(1)<lang%   ! ist genug Platz auf der Disk?
    ALERT 1,"Nicht genug Speicher auf Disk!", 1,"ENDE",bac| 
ENDIF
RESERVE lang%       ! Puffer vorbereiten
puf%=MALLOC(lang%)
adrx%=LPEEK(&H4F2)  ! Zeiger auf Adresse des TOS im ROM
FOR i=0 TO lang%
    a&=PEEK(adrx%+i%) ! ROM byteweise auslesen 
    POKE puf%+i%,a& ! und in Puffer schreiben 
NEXT i%
BSAVE "a:\tos.img",puf%,lang%
                    ! das Ganze auf Disk schreiben 
~MFREE(puf%)        ! Puffer freigeben
RESERVE
PRINT "fertig!"
PAUSE 50 
EDIT


Aus: ST-Computer 04 / 1992, Seite 144

Links

Copyright-Bestimmungen: siehe Über diese Seite