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