Allow libcom32 to detect a disabled video console, and act appropriately.
authorhpa <hpa>
Wed, 5 Jan 2005 07:45:23 +0000 (07:45 +0000)
committerhpa <hpa>
Wed, 5 Jan 2005 07:45:23 +0000 (07:45 +0000)
com32/lib/sys/ansicon_write.c
comboot.doc
comboot.inc

index d3bdff1..b22421e 100644 (file)
@@ -57,6 +57,7 @@ enum ansi_state {
 #define MAX_PARMS      16
 
 struct term_state {
+  int disabled;
   int attr;                    /* Current display attribute */
   int vtgraphics;              /* VT graphics on/off */
   int intensity;
@@ -76,6 +77,7 @@ struct term_state {
 
 static const struct term_state default_state =
 {
+  .disabled = 0,
   .attr = 0x07,                        /* Grey on black */
   .vtgraphics = 0,
   .intensity = 1,
@@ -103,10 +105,20 @@ static const char decvt_to_cp437[] =
 static void __constructor ansicon_init(void)
 {
   static com32sys_t ireg;      /* Auto-initalized to all zero */
+  com32sys_t oreg;
 
   /* Initial state */
   memcpy(&st, &default_state, sizeof st);
 
+  /* Are we disabled? */
+  ireg.eax.w[0] = 0x000b;
+  __intcall(0x22, &ireg, &oreg);
+
+  if ( (signed char)oreg.ebx.b[1] < 0 ) {
+    st.disabled = 1;
+    return;
+  }
+
   /* Force text mode */
   ireg.eax.w[0] = 0x0005;
   __intcall(0x22, &ireg, NULL);
@@ -114,8 +126,8 @@ static void __constructor ansicon_init(void)
   /* Get cursor shape */
   ireg.eax.b[1] = 0x03;
   ireg.ebx.b[1] = BIOS_PAGE;
-  __intcall(0x10, &ireg, &ireg);
-  st.cursor_type = ireg.ecx.w[0];
+  __intcall(0x10, &ireg, &oreg);
+  st.cursor_type = oreg.ecx.w[0];
 }
 
 /* Erase a region of the screen */
@@ -506,6 +518,9 @@ ssize_t __ansicon_write(struct file_info *fp, const void *buf, size_t count)
 
   (void)fp;
 
+  if ( st.disabled )
+    return n;                  /* Nothing to do */
+
   while ( count-- ) {
     ansicon_putchar(*bufp++);
     n++;
index 62b17db..7719068 100644 (file)
@@ -424,6 +424,7 @@ AX=000Bh [2.00]     Get Serial Console Configuration
        Output: DX      Serial port I/O base (e.g. 3F8h = COM1...)
                CX      Baud rate divisor (1 = 115200 bps, 2 = 57600 bps...)
                BX      Flow control configuration bits (see syslinux.doc)
+                       -> Bit 15 is set if the video console is disabled
 
        If no serial port is configured, DX will be set to 0 and the
        other registers are undefined.
index 3859998..44d02d8 100644 (file)
@@ -509,6 +509,10 @@ comapi_serialcfg:
                or al,ah
                mov ah,[FlowIgnore]
                shr ah,4
+               test byte [DisplayCon],01h
+               jnz .normalconsole
+               or ah,80h
+.normalconsole:
                mov P_BX,ax
                clc
                ret