Announcement

Collapse
No announcement yet.

PB/DOS - Setting EGA/VGA-Lines, BlinkMode etc.

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • PB/DOS - Setting EGA/VGA-Lines, BlinkMode etc.

    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
    
    ' ==============================================================================
    ------------------
Working...
X