4. Standard-Probleme (Teil 2)
Standard-Probleme (Teil 1)
4.7. Fehler 502/514 bei Verwendung von C-OBJ-Files
Bei der Verwendung von C-OBJ-Files ist darauf zu achten, das in der
OBJ-Datei nicht mehrere Anweisungen für das Datensegment zu finden
sind, da PowerBASIC nur ein Datensegment pro OBJ-File unterstützt.
Da mir zu Zeit auch keine Lösung zu diesem Problem bekannt ist und
es vermutlich keine seitens PowerBASIC gibt, bleibt meines Erachtens
nur das Anpassen Ihrer C-Source übrig.
4.8. Warmboot über STRG-ALT-ENTF verhindern
Folgende Source verhindert einen möglichen Warmboot:
Beispiel:
KEY 15, CHR$(&h0C, &h53, &h73)
ON KEY(15) GOSUB NoBoot
KEY(15) ON
DO
IF INKEY$ <> "" THEN EXIT LOOP
LOOP
PRINT "Fertig"
END
NoBoot:
PRINT "Warmstart nicht erwünscht!"
RETURN
4.9. Öffnen von mehr als 15 Files mit PowerBASIC und/oder mit DOS
Oft scheint man an die Grenzen von PowerBASIC zu stoßen, sofern man
mehr als 15 Files öffnen will. Dabei ist dieses Problem überhaupt nicht
ein Mangel des Compilers, sondern eher ein genetischer Geburtsfehler
von MS-DOS.
Um diesen Effekt zu erklären muß ich leider ein wenig in die Untiefen
von DOS Licht bringen, denn dort finden wir auch des Rätsels Lösung.
Vielen ist bestimmt bekannt, das nach dem Öffnen von Dateien ein
Handel zurückgeliefert wird. Nur wo speichert DOS dieses Handle und
die Informationen die zu diesem Handle gehören?
Vielen ist bestimmt der Begriff PSP (Programm Segment Prefix) ein
Begriff (bereits kurz erwähnt bei der Ermittlung des Dateinamens), wenn
nicht sollten Sie die folgenden Ausführungen besser überlesen und die
Source testen.
Dieses PSP enthält jedenfalls eine Tabelle, welche durch Microsoft
zwar als reserviert gilt, deren Bedeutung aber längst klar ist. Diese
Tabelle nennt sich 'Job File Table' (kurz JFT) und befindet sich ab
DOS 2.0 am Offset 18Hex und umfasst ein 20 Felder großes BYTE-Array.
Zieht man jetzt die ständig belegten Handles für: NUL, $CLOCK, CON
AUX und PRN ab, so verbleiben unsere magischen verfügbaren 15 Handles.
Die Aufgabe der JFT ist es allerdings lediglich, einen Zeiger auf die
'System File Table' kurz SFT zu verwalten.
Die SFT wiederum ist eine MCB (Memory Controll Block) ähnlich verkettete
Struktur, welche wichtige Daten wie Startcluster und Sharingattribute
verwaltet. Eine solche SFT kann nur eine bestimmte Anzahl von Handles
beinhalten, um diese zu Erhöhen muß in der CONFIG.SYS ein höherer Wert bei
FILES angegeben werden. Nach dem Neustart des System reserviert MS-DOS
nun mehr als SFT markierte MCB's. Sie könnten also nun theoretisch mehr
als 20 Files öffnen, denn der Defaultwert bei FILES ist '8'.
Leider stoßen wir hierbei wiederum auf die begrenzte Anzahl der Einträge
in der JFT innerhalb des PSP. Ab MS-DOS 3.3 gibt es hierbei aber Abhilfe,
da der INT &h21, Funktion &h67 ermöglicht die Anzahl der verfügbaren
Handles zu erhöhen. Nur wie geht das genau, wo doch der Platz innerhalb
des PSP begrenzt ist??
Dazu erinnern wir uns wieder an die undokumentierten Felder innerhalb
des PSP. Interessant wird jetzt der Offset &h32, dieser enthät die neue
Größe der JFT in WORD. Darauf folgt der neue Pointer zur Extendet JFT.
Interessant ist hierbei nur, das dieses neue Array ein Array vom Typ
WORD ist. Es können also theoretisch 65535 Handles verwaltet werden,
was allerdings rein Hypothetisch ist, da die SFT weiterhin nur 255
Einträge verwalten kann.
Wichtig bei der Neuzuweisung einer JFT sind eigentlich nur zwei Dinge:
- Die neuen JFT benötigt Speicher, das heißt sie müssen den Heap
des aktuellen PowerBASIC Programms herunterschrauben!
- Eine Extendet JFT wird bei SHELL/EXECUTE nicht an das Child-
Programm vererbt! Für das Child-Programm gilt also wieder die
15 Files Grenze.
Ok, jetzt aber die Source:
'***********************************************************************
'
' Erhöhen der verfügbaren Handles in PowerBASIC 3.2
'
' entwickelt von Th.Gohel Fido: 2:2410/301.12
' InterNet: support@pbsound.snafu.de
' Homepage: http://www.snafu.de/~pbsound/
'
'***********************************************************************
MaxFiles% = 30 ' entspricht FILES = 30
PBFiles MaxFiles% ' anpassen der verfügbaren Files
FOR i% = 1 TO MaxFiles% ' Testen der verfügbaren Files
PRINT "™ffne File: PBFILES." + STR$(i%)
OPEN "PBFILES." + STR$(i%) FOR BINARY AS i%
PUT$ i%, "Testdatei" + STR$(i%) + " für PBFILES, bitte löschen!"
NEXT i%
FOR i% = 1 TO MaxFiles% ' und wieder schliessen
CLOSE i%
NEXT i%
SUB PBFiles(BYVAL MoreFiles%)
x& = SETMEM(-255) ' sollte Ausreichen für alle Fälle
! mov ah, &h67 ; Anzahl der verfügbaren Handles
! mov bx, MoreFiles% ; festlegen
! add bx, 6 ; die Standard-Handles für PB
! int &h21
! jnc PBFiles_Ok
PRINT "Fehler beim Einrichten der verfügbaren Handles!!"
PBFiles_Ok:
END SUB
4.10. HEX$-DWORD Routine für PowerBASIC 3.1/3.2
Nachfolgende Routine soll, den für mich unverständlicherweise fehlenden
HEX$-Support für Variablen vom Typ DWORD, ermöglichen.
Beispiel:
d??? = &h1234ABCD
PRINT DHex$(d???)
FUNCTION DHex(HexDWord???) AS STRING
DIM Lo AS WORD
DIM Hi AS WORD
! les bx, [bp+6]
! mov ax, es:[bx+0]
! mov Lo??, ax
! mov ax, es:[bx+2]
! mov Hi??, ax
DHex = RIGHT$("000" + HEX$(Hi??), 4) + RIGHT$("000" + _
HEX$(Lo??), 4)
END FUNCTION
Standard-Probleme (Teil 1)