1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
//
// borrowed for temprorary softpc console support
//
/*++ BUILD Version: 0001
*
* x86 v1.0
*
* XWINCON.H
* Windows support functions for console windows
*
* History
* Created 27-Dec-90 by Jeff Parsons
*
* COPYRIGHT NOTICE
* This source file may not be distributed, modified or incorporated into
* another product without prior approval from the author, Jeff Parsons.
* This file may be copied to designated servers and machines authorized to
* access those servers, but that does not imply any form of approval.
*/
typedef unsigned int UINT; // ints preferred
typedef int INT; // ints preferred
typedef CHAR *NPSZ;
typedef INT (FAR PASCAL *INTPROC)(HWND, UINT, UINT, LONG);
#define DEF_CCHIN 16 // default input buffer size
#define DEF_CCHXOUT 80 // default output buffer width
#define DEF_CCHYOUT 25 // default output buffer height
#define CON_SCROLL_LOCK 0x0010 // console has SCROLL-LOCK set
#define CON_NUM_LOCK 0x0020 // console has NUM-LOCK set
#define CON_CAPS_LOCK 0x0040 // console has CAPS-LOCK set
#define CON_LEDS_MASK 0x0070 //
#define CON_FOCUS 0x0100 // console has focus
#ifndef VK_OEM_SCROLL
#define VK_OEM_SCROLL 0x91 // left out of windows.h for some reason...
#endif
#define INVALIDATE_SCROLL 2
#define IDM_DBBRK 100
#define IDM_ABOUT 101
#define CLR_BLACK 0x00000000
#define CLR_RED 0x007F0000
#define CLR_GREEN 0x00007F00
#define CLR_BROWN 0x007F7F00
#define CLR_BLUE 0x0000007F
#define CLR_MAGENTA 0x007F007F
#define CLR_CYAN 0x00007F7F
#define CLR_LT_GRAY 0x00BFBFBF
#define CLR_DK_GRAY 0x007F7F7F
#define CLR_BR_RED 0x00FF0000
#define CLR_BR_GREEN 0x0000FF00
#define CLR_YELLOW 0x00FFFF00
#define CLR_BR_BLUE 0x000000FF
#define CLR_BR_MAGENTA 0x00FF00FF
#define CLR_BR_CYAN 0x0000FFFF
#define CLR_WHITE 0x00FFFFFF
#define OPT_FONT 0x0004 // use small OEM font if available (/s)
#define OPT_DOUBLE 0x0020 // use 50-line debug window w/small font (/50)
#define OPT_CAPS 0x0002 // map ctrl keys to caps-lock (/c)
#define OPT_TERMINAL 0x0010 // redirect all window output to terminal (/t)
#define OPT_FLUSH 0x0100 // flush prefetch after every jump (/f)
#define OPT_NOXLATE 0x0200 // disable built-in translations (/n)
#define OPT_DEBUG 0x0008 // shadow all log output on debug terminal (/d)
#define OPT_GO 0x0001 // do an initial "go" (/g)
#define CTRL_A 1 // used by gets to repeat last line
#define CTRL_C 3 // break in debug window
#define CTRL_Q 17 // flow control
#define CTRL_S 19 // flow control
#define BELL 7 //
#define BS 8 // backspace
#define TAB 9 //
#define LF 10 // linefeed
#define CR 13 // return
#define ESCAPE 27 //
#define SIGNAL_EMULATE 1
#define ERR_NONE 0x0
#define TRUE_IF_WIN32 1
/* Per-window information
*/
#ifdef WIN_16
#define GETPCONSOLE(hwnd) (PCONSOLE)GetWindowWord(hwnd,0)
#define SETPCONSOLE(hwnd,p) (PCONSOLE)SetWindowWord(hwnd,0,(INT)p)
#endif
#ifdef WIN_32
#define GETPCONSOLE(hwnd) (PCONSOLE)GetWindowLong(hwnd,0)
#define SETPCONSOLE(hwnd,p) (PCONSOLE)SetWindowLong(hwnd,0,(LONG)p)
#endif
#ifdef PM
#define GETPCONSOLE(hwnd) (PCONSOLE)WinQueryWindowUShort(hwnd,0)
#define SETPCONSOLE(hwnd,p) (PCONSOLE)WinSetWindowUShort(hwnd,0,(USHORT)p)
#endif
#define GETICARET(pcon) (pcon->chyCaret*pcon->cchxOut+pcon->chxCaret)
#define GETPCARET(pcon) (pcon->pchOut+GETICARET(pcon))
#define GETXCARET(pcon) (pcon->chxCaret*pcon->cxChar)
#ifdef WIN
#define GETYCARET(pcon) (pcon->chyCaret*pcon->cyChar)
#else
#define GETYCARET(pcon) (pcon->cyOut - pcon->chyCaret*pcon->cyChar)
#endif
#define GETILINE(pcon,chy) ((chy)*pcon->cchxOut)
#define GETPLINE(pcon,chy) (pcon->pchOut+GETILINE(pcon,chy))
#define GETICHAR(pcon,chx,chy) ((chy)*pcon->cchxOut+(chx))
#define GETPCHAR(pcon,chx,chy) (pcon->pchOut+GETICHAR(pcon,chx,chy))
#define GETXCHAR(pcon,chx) (pcon->cxChar*(chx))
#ifdef WIN
#define GETYCHAR(pcon,chy) (pcon->cyChar*(chy))
#else
#define GETYCHAR(pcon,chy) (pcon->cyOut - pcon->cyChar*(chy))
#endif
#define WORDOF(i,n) (((PWORD)&(i))[n])
#define LOW(l) WORDOF(l,0)
#define NPVOID(p) ((VOID *)(p))
typedef struct key_s {
INT iKey;
LONG lKeyType;
} KEY, *PKEY;
typedef struct console_s {
INT flCon; // console flags (see CON_*)
PKEY pkIn; // pointer to input buffer
HANDLE hkEvent; // handle to key event
INT ikHead; // input head (where to store next key)
INT ikTail; // input tail (where to retrieve next key)
INT ikMax; // maximum input index
HFONT hFont; // font identifier
INT cxChar; // character width, in pixels
INT cyChar; // character height, in pixels
INT cxOut; // buffer width, in pixels
INT cyOut; // buffer height, in pixels
INT cchxOut; // buffer width, in chars
INT cchyOut; // buffer height, in chars
UINT cbOut; // buffer size, in bytes
PCHAR pchOut; // pointer to output buffer
INT chxCaret; // caret x location, in char coordinates
INT chyCaret; // caret y location, in char coordinates
} CONSOLE, *PCONSOLE;
/* Function prototypes
*/
PCONSOLE initconsole(HWND hwnd, INT cchIn, INT cchxOut, INT cchyOut, INT iFont);
VOID freeconsole(HWND hwnd);
VOID clearconsole(HWND hwnd);
VOID invalidateconsole(HWND hwnd, PRECT prc, BOOL fUpdate);
INT wprint(HWND hwnd, NPSZ psz, INT n);
INT wgetch(HWND hwnd);
BOOL wkbhit(HWND hwnd);
VOID wyield(HANDLE);
INT wputch(HWND hwnd, INT i);
VOID setcaret(HWND hwnd, INT x, INT y);
VOID getcaret(HWND hwnd, PINT px, PINT py);
VOID writechar(HWND hwnd, CHAR ch, INT n);
VOID scrollrect(HWND hwndGuest, PRECT prc, INT n);
extern HWND hwndGuest;
extern HANDLE hHostInstance;
extern INT flOptions; // command-line options (see OPT_*)
extern INT flSignals; // signal flags (see SIGNAL_*)
LONG FAR PASCAL VDMWndProc(HWND hwnd, UINT wMsg, UINT uParam, LONG lParam);
BOOL FAR PASCAL VDMAbout(HWND hDlg, UINT wMsg, UINT uParam, LONG lParam);
VOID processmessages(HWND hwnd);
INT getkbdleds(VOID);
VOID setkbdleds(INT flCon);
VOID mapkbdkeys(PCONSOLE pcon, UINT iParam, BOOL fDown);
|