4. Standard-Probleme (Teil 2)

English


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:

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)


(c) 1995/2007 by Thomas Gohel, All rights and bug's reserved