Code:
' Recompile 13.02.94 PB3

' ┌────────────────────┬───&#947 2;──────────┬───────┬──────&#9 472;───┬─────────────────────& #9488;
' │                    │ TEXTMOD1.PBL │ 2.0.0 │ 30.07.92 │ UNIT                │
' │ IDENTIFIKATION     ├──────────────┴───────┴─&#947 2;────────┴────────────────&#9 472;────┤
' │                    │ 25-,28-,43- und 50-Zeilen Textmodi für VGA-/EGA-Karten│
' │                    │ Setzen des Blinkmodus                                 │
' │                    │ Setzen des Graustufenmodus                            │
' ├────────────────────┼───&#947 2;─────────────────────────&#9 472;─────────────────────────& #9508;
' │ AUTOR              │ M.Hoffmann, Friedensallee 105, 2000 Hamburg 50        │
' ├────────────────────┼───&#947 2;─────────────────────────&#9 472;─────────────────────────& #9508;
' │ FUNKTION           │ s.o.                                                  │
' ├────────────────────┼───&#947 2;─────────────────────────&#9 472;─────────────────────────& #9508;
' │ HISTORIE           │ Version 1.0.0 - erste Version                         │
' │                    │         2.0.0 - Verfahren zur Umschaltung modifiziert │
' │                    │               - Blink/Graustufenmodusumschaltung      │
' │                    │                 integriert                            │
' │                    │               - Abfragefunktionen integriert          │
' │                    │                ACHTUNG: Routinennamen geändert!      │
' ├────────────────────┼───&#947 2;─────────────────────────&#9 472;─────────────────────────& #9508;
' │ ENTWICKLUNGSSYSTEM │ PowerBasic 2.10a                                      │
' ├────────────────────┼───&#947 2;─────────────────────────&#9 472;─────────────────────────& #9508;
' │ VORAUSSETZUNGEN    │ EGA- (43-Modus) bzw. VGA- (28,50-Modi) Karte notwendig│
' ├────────────────────┼───&#947 2;─────────────────────────&#9 472;─────────────────────────& #9508;
' │ IMPLEMENTATION     │                                                       │
' │                    │                                                       │
' │ FUNCTION TextMode  │ (0│25│28│43│50)                                       │
' │                    │                                                       │
' │                    │ Bei 0 wird lediglich die aktuelle Zeilenzahl zurück-  │
' │                    │ geliefert, ohne eine Änderung vorzunehmen.            │
' │                    │ Ansonsten wird versucht, die Zeilenzahl umzuschalten  │
' │                    │ und die nun eingestellte Zahl wird zurückgeliefert.   │
' │                    │ Bei Angabe eines falschen Parameters wird -1 zurück-  │
' │                    │ geliefert. Der Erfolg kann also folgendermaßen        │
' │                    │ geprüft werden:                                       │
' │                    │ IF TextMode(NewRows) <> NewRows THEN ' NoSuccess      │
' │                    │                                                       │
' │ FUNCTION EgaVga    │ Liefert 1, wenn EGA- oder VGA-Monitor vorhanden       │
' │                    │ Diese Prüfung ist NICHT explizit in den anderen       │
' │                    │ Funktionen enthalten!                                 │
' │                    │                                                       │
' │ SUB SetBlinkOff    │ Bit 3 der Hintergrundfarbe bestimmt INTENSIVE Anzeige │
' │ SUB SetBlinkOn     │ Bit 3 der Hintergrundfarbe bestimmt BLINKENDE Anzeige │
' │ FUNCTION BlinkMode │ Aktuelle Einstellung erfragen                         │
' │                    │  0 = Blinken  ²)                                      │
' │                    │  1 = Intensed ²)                                      │
' │                    │                                                       │
' │ SUB SetGreyOn      │ Umwandlung in Graustufen anschalten                   │
' │ SUB SetGreyOff     │ Umwandlung in Graustufen abschalten                   │
' │                    │ Aktuelle Einstellung kann z.Zt. NICHT erfragt werden! │
' │                    │ -- Wird erst NACH TextMode() aktiv!                   │
' │ FUNCTION GreyMode  │ Aktuelle Einstellung erfragen                         │
' │                    │  0 = Farbe      ²)                                    │
' │                    │  1 = Graustufen ²)                                    │
' ├────────────────────┼───&#947 2;─────────────────────────&#9 472;─────────────────────────& #9508;
' │ SONSTIGES          │ ACHTUNG:                                              │
' │                    │ - PBs LOCATE/CSRLIN/SCREEN... gehen nur bis y=25!     │
' │                    │                                                       │
' │                    │ ²) Da nur eine Abfrage eigener interner Variablen     │
' │                    │    erfolgt, stimmen die zurückgelieferten Werte u.U.  │
' │                    │    erst, nachdem SetBlink* und SetGrey* einmal aufge- │
' │                    │    rufen wurden!                                      │
' └────────────────────┴───&#947 2;─────────────────────────&#9 472;─────────────────────────& #9496;

' ┌────────────────────────&#947 2;─────────────────────────&#9 472;─────────────────────────& #9488;
' │ COMPILEROPTIONEN                                                           │
' └────────────────────────&#947 2;─────────────────────────&#9 472;─────────────────────────& #9496;

$COM      0
$COMPILE  UNIT
$CPU      80386
$DEBUG    MAP-,PBDEBUG-,PATH-,UNIT-
$DIM      ARRAY
$ERROR    BOUNDS-,NUMERIC-,OVERFLOW-,STACK-
$EVENT    OFF
$FLOAT    EMULATE
$LIB      COM-,LPT-,CGA-,EGA-,VGA-,FULLFLOAT-,IPRINT-
$OPTIMIZE SIZE
$OPTION   CNTLBREAK-,GOSUB-,SIGNED-
$SOUND    0
$STACK    &H800
$STATIC
$STRING   1

DEFINT A-Z

' ┌────────────────────────&#947 2;─────────────────────────&#9 472;─────────────────────────& #9488;
' │ SHARED VARs                                                                │
' └────────────────────────&#947 2;─────────────────────────&#9 472;─────────────────────────& #9496;

SHARED NoBlnk ' interne Hilfsvariablen, weil z.Zt. nicht bekannt ist, wie
SHARED GreyOn ' diese Zustände abgefragt werden können! Siehe auch ²) oben!

' ┌────────────────────────&#947 2;─────────────────────────&#9 472;─────────────────────────& #9488;
' │ ROUTINEN                                                                   │
' └────────────────────────&#947 2;─────────────────────────&#9 472;─────────────────────────& #9496;

FUNCTION TextMode (Modus) LOCAL PUBLIC

   IF Modus = 25 THEN
      $INLINE &HB8,&H02,&H12 ' MOV AX,1202h Funktion 12/30: 2=400 Punktreihen
      $INLINE &HBB,&H30,&H00 ' MOV BX,0030h (hier SubFn in BL)
      $INLINE &HCD,&H10      ' INT 10h
      $INLINE &HB8,&H83,&H00 ' MOV AX,0083h Def VideoModus (80&#168;25,16Col) ²
      $INLINE &HCD,&H10      ' INT 10h
      $INLINE &HB8,&H14,&H11 ' MOV AX,1114h Funktion 11/14: 25 Zeilen 8*16er
      $INLINE &HBB,&H00,&H00 ' MOV BX,0000h Standardzeichensatz
      $INLINE &HCD,&H10      ' INT 10h
   ELSEIF Modus = 28 THEN
      $INLINE &HB8,&H02,&H12 ' MOV AX,1202h Funktion 12/30: 2=400 Punktreihen
      $INLINE &HBB,&H30,&H00 ' MOV BX,0030h (hier SubFn in BL)
      $INLINE &HCD,&H10      ' INT 10h
      $INLINE &HB8,&H83,&H00 ' MOV AX,0083h Def VideoModus (80&#168;25,16Col) ²
      $INLINE &HCD,&H10      ' INT 10h
      $INLINE &HB8,&H11,&H11 ' MOV AX,1111h Funktion 11/11: 28 Zeilen 8*14er
      $INLINE &HBB,&H00,&H00 ' MOV BX,0000h Standardzeichensatz
      $INLINE &HCD,&H10      ' INT 10h
   ELSEIF Modus = 43 THEN
      $INLINE &HB8,&H01,&H12 ' MOV AX,1201h Funktion 12/30: 1=350 Punktreihen
      $INLINE &HBB,&H30,&H00 ' MOV BX,0030h (hier SubFn in BL)
      $INLINE &HCD,&H10      ' INT 10h
      $INLINE &HB8,&H83,&H00 ' MOV AX,0083h Def VideoModus (80&#168;25,16Col) ²
      $INLINE &HCD,&H10      ' INT 10h
      $INLINE &HB8,&H12,&H11 ' MOV AX,1112h Funktion 11/12 (EGA): 8*8er
      $INLINE &HBB,&H00,&H00 ' MOV BX,0000h Standardzeichensatz
      $INLINE &HCD,&H10      ' INT 10h
   ELSEIF Modus = 50 THEN
      $INLINE &HB8,&H02,&H12 ' MOV AX,1202h Funktion 12/30: 2=400 Punktreihen
      $INLINE &HBB,&H30,&H00 ' MOV BX,0030h (hier SubFn in BL)
      $INLINE &HCD,&H10      ' INT 10h
      $INLINE &HB8,&H83,&H00 ' MOV AX,0083h Def VideoModus (80&#168;25,16Col) ²
      $INLINE &HCD,&H10      ' INT 10h
      $INLINE &HB8,&H12,&H11 ' MOV AX,1112h Funktion 11/12: 50 Zeilen 8*8er
      $INLINE &HBB,&H00,&H00 ' MOV BX,0000h Standardzeichensatz
      $INLINE &HCD,&H10      ' INT 10h
   ELSEIF Modus <> 0 THEN
      TextMode = -1
      EXIT FUNCTION
   END IF

   ' Wiederherstellung des Intensedmodus, da dieser beim Umschalten
   ' verloren geht!
   IF Modus <> 0 THEN
      IF NoBlnk THEN
         CALL SetBlinkOff
      END IF
   END IF

   DEF SEG  = &H0040
   TextMode = PEEK(&H0084)+1
   DEF SEG

END FUNCTION

' ------------------------------------------------------------------------------

FUNCTION EgaVga LOCAL PUBLIC

   EgaVga       = 0
   DEF SEG      = &H0040
   BIOSInfoByte = PEEK(&H0087)
   DEF SEG
   IF NOT (BIOSInfoByte AND &B00001000) = &B00001000 THEN
      EgaVga    = 1
   END IF

END FUNCTION

' ------------------------------------------------------------------------------

SUB SetBlinkOff LOCAL PUBLIC

   $INLINE &HB8,&H03,&H10 ' MOV AX,1003h
   $INLINE &HBB,&H00,&H00 ' MOV BX,0000h
   $INLINE &HCD,&H10      ' INT 10h
   NoBlnk = 1

END SUB

' ------------------------------------------------------------------------------

SUB SetBlinkOn LOCAL PUBLIC

   $INLINE &HB8,&H03,&H10 ' MOV AX,1003h
   $INLINE &HBB,&H01,&H00 ' MOV BX,0001h
   $INLINE &HCD,&H10      ' INT 10h
   NoBlnk = 0

END SUB

' ------------------------------------------------------------------------------

FUNCTION BlinkMode LOCAL PUBLIC
   BlinkMode = NoBlnk
END FUNCTION

' ------------------------------------------------------------------------------

SUB SetGreyOn LOCAL PUBLIC

   $INLINE &HB8,&H00,&H12 ' MOV AX,1200h Funktion 12h; 00 = Grauumwandlung AN
   $INLINE &HBB,&H33,&H00 ' MOV BX,0033h Subfunktion 33h
   $INLINE &HCD,&H10      ' INT 10h
   GreyOn = 1

END SUB

' ------------------------------------------------------------------------------

SUB SetGreyOff LOCAL PUBLIC

   $INLINE &HB8,&H01,&H12 ' MOV AX,1200h Funktion 12h; 01 = Grauumwandlung AUS
   $INLINE &HBB,&H33,&H00 ' MOV BX,0033h Subfunktion 33h
   $INLINE &HCD,&H10      ' INT 10h
   GreyOn = 0

END SUB

' ------------------------------------------------------------------------------

FUNCTION GreyMode LOCAL PUBLIC
   GreyMode = GreyOn
END FUNCTION

' ==============================================================================
------------------