diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-04-22 04:49:35 +0300 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-04-23 06:51:22 +0300 |
commit | 522d0aafc73e4412439921e2dcd10f698984a94f (patch) | |
tree | 07c2c594182e8b502d70916019f49ce8791a3e03 | |
parent | 21a986f52bd2fb1e6522503cc9796adf71b29a37 (diff) | |
download | videoteco-fork-522d0aafc73e4412439921e2dcd10f698984a94f.tar.gz |
DOS: implemented console size detection
This is done via 10h interrupts and special memory regions.
The alternative would have been to use set the cursor to 9999,9999
and query the cursor position via ANSI escape sequences.
-rw-r--r-- | Makefile.wcc | 3 | ||||
-rw-r--r-- | teco.h | 4 | ||||
-rw-r--r-- | tecterm.c | 35 |
3 files changed, 41 insertions, 1 deletions
diff --git a/Makefile.wcc b/Makefile.wcc index 21d1b8e..ffee78c 100644 --- a/Makefile.wcc +++ b/Makefile.wcc @@ -24,7 +24,8 @@ LDFLAGS += format dos option map option stack=16k & set WCC_DEFS=-dSTDC_HEADERS=1 -dHAVE_STDIO_H -dHAVE_CTYPE_H -dHAVE_ERRNO_H & -dHAVE_STRING_H -dHAVE_STRINGS_H -dHAVE_FCNTL_H -dHAVE_IO_H & -dHAVE_SYS_STAT_H -dHAVE_SIGNAL_H -dHAVE_STDLIB_H -dHAVE_UNISTD_H & - -dHAVE_STDINT_H -dHAVE_DIRECT_H -dHAVE_SBRK -dHAVE_STRCHR -dTERMCAP + -dHAVE_STDINT_H -dHAVE_DIRECT_H -dHAVE_I86_H & + -dHAVE_SBRK -dHAVE_STRCHR -dTERMCAP all : teco.exe .SYMBOLIC @@ -477,6 +477,10 @@ typedef unsigned long teco_ptrint_t; #include <direct.h> #endif +#if HAVE_I86_H +#include <i86.h> +#endif + #if HAVE_SYS_WAIT_H # include <sys/wait.h> #endif @@ -1069,6 +1069,32 @@ term_flush() }/* End Routine */ +#ifdef MSDOS + +#define VIDEO 0x10 + +static int +term_isvga(void) +{ + union REGS regs; + regs.x.ax = 0x1a00; + int86(VIDEO, ®s, ®s); + return regs.h.al == 0x1a && regs.h.bl > 6; +} + +static int +term_isega(void) +{ + union REGS regs; + if(term_isvga()) return 0; + regs.h.ah = 0x12; + regs.h.bl = 0x10; + int86(VIDEO, ®s, ®s); + return regs.h.bl != 0x10; +} + +#endif + /** @@ -1115,6 +1141,15 @@ init_term_description( void ) * really knows the size of the terminal window, and in this case, we will * leave it alone. */ +#ifdef MSDOS + /* + * NOTE: It could also be done generically with + * term_goto(9999,9999), followed by \e[6n + */ + if(!term_columns) term_columns = *(uint8_t*)MK_FP(0x40,0x4a) & 255; + if(!term_lines && (term_isvga() || term_isega())) term_lines = *(uint8_t*)MK_FP(0x40,0x84) + 1; +#endif + #ifdef TERMCAP if(!term_columns) term_columns = tgetnum("co"); if(!term_lines) term_lines = tgetnum("li"); |