2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
14 * $Source: /cvs/cvsroot/d2x/arch/dos/mono.c,v $
16 * $Author: schaffner $
17 * $Date: 2004-08-28 23:17:45 $
19 * Library functions for printing to mono card.
24 static char rcsid[] = "$Id: mono.c,v 1.2 2004-08-28 23:17:45 schaffner Exp $";
27 // Library functions for printing to mono card.
38 //#define MONO_IS_STDERR
41 #pragma aux mono_int_3 = "int 3";
43 static inline void mono_int_3() { asm("int $3"); }
45 void msetcursor(short row, short col);
47 #define MAX_NUM_WINDOWS 2
50 unsigned char character;
51 unsigned char attribute;
62 struct mono_element save_buf[25][80];
63 struct mono_element text[25][80];
67 void scroll( short n );
68 void drawbox( short n );
70 #define ROW Window[n].first_row
71 #define HEIGHT Window[n].height
72 #define COL Window[n].first_col
73 #define WIDTH Window[n].width
74 #define CROW Window[n].cursor_row
75 #define CCOL Window[n].cursor_col
76 #define OPEN Window[n].open
77 #define CHAR(r,c) (*monoscreen)[ROW+(r)][COL+(c)].character
78 #define ATTR(r,c) (*monoscreen)[ROW+(r)][COL+(c)].attribute
79 #define XCHAR(r,c) Window[n].text[ROW+(r)][COL+(c)].character
80 #define XATTR(r,c) Window[n].text[ROW+(r)][COL+(c)].attribute
82 static WINDOW Window[MAX_NUM_WINDOWS];
84 struct mono_element (*monoscreen)[25][80];
86 void mputc( short n, char c )
90 // if (keyd_pressed[KEY_BACKSP])
99 CHAR( CROW, CCOL ) = ' ';
100 ATTR( CROW, CCOL ) = XATTR( CROW, CCOL );
101 XCHAR( CROW, CCOL ) = ' ';
104 CHAR( CROW, CCOL ) = ' ';
105 ATTR( CROW, CCOL ) = XATTR( CROW, CCOL );
106 XCHAR( CROW, CCOL ) = ' ';
116 CHAR( CROW, CCOL ) = c;
117 ATTR( CROW, CCOL ) = XATTR( CROW, CCOL );
118 XCHAR( CROW, CCOL ) = c;
122 if ( CCOL >= WIDTH ) {
126 if ( CROW >= HEIGHT ) {
131 msetcursor( ROW+CROW, COL+CCOL );
135 void mputc_at( short n, short row, short col, char c )
147 void copy_row(int nwords,short *src, short *dest1, short *dest2 );
148 #pragma aux copy_row parm [ecx] [esi] [ebx] [edx] modify exact [eax ebx ecx edx esi] = \
157 "even_num: cmp ecx, 0" \
159 "rowloop: mov eax, [esi]" \
168 void copy_row(int nwords,short *src, short *dest1, short *dest2 ) {
170 *(dest1++) = *(dest2++) = *(src++);
174 void scroll( short n )
176 register int row, col;
181 for ( row = 0; row < (HEIGHT-1); row++ )
182 copy_row( WIDTH, (short *)&XCHAR(row+1,col), (short *)&CHAR(row,col), (short *)&XCHAR(row,col) );
184 // for ( col = 0; col < WIDTH; col++ )
186 // CHAR( row, col ) = XCHAR( row+1, col );
187 // ATTR( row, col ) = XATTR( row+1, col );
188 // XCHAR( row, col ) = XCHAR( row+1, col );
189 // XATTR( row, col ) = XATTR( row+1, col );
192 for ( col = 0; col < WIDTH; col++ )
194 CHAR( HEIGHT-1, col ) = ' ';
195 ATTR( HEIGHT-1, col ) = XATTR( HEIGHT-1, col );
196 XCHAR( HEIGHT-1, col ) = ' ';
201 void msetcursor(short row, short col)
203 int pos = row*80+col;
206 outp( 0x3b5, pos & 0xFF );
208 outp( 0x3b5, (pos >> 8) & 0xff );
211 static char temp_m_buffer[1000];
212 void _mprintf( short n, char * format, ... )
214 #ifdef MONO_IS_STDERR
216 va_start(args, format );
217 vfprintf(stderr, format, args);
219 char *ptr=temp_m_buffer;
224 va_start(args, format );
225 vsprintf(temp_m_buffer,format,args);
231 void _mprintf_at( short n, short row, short col, char * format, ... )
234 char buffer[1000], *ptr=buffer;
244 va_start(args, format );
245 vsprintf(buffer,format,args);
252 msetcursor( ROW+CROW, COL+CCOL );
257 void drawbox(short n)
263 for (row=0; row <HEIGHT; row++ ) {
264 CHAR( row, -1 ) = 179;
265 CHAR( row, WIDTH ) = 179;
266 XCHAR( row, -1 ) = 179;
267 XCHAR( row, WIDTH ) = 179;
270 for (col=0; col < WIDTH; col++ ) {
271 CHAR( -1, col ) = 196;
272 CHAR( HEIGHT, col ) = 196;
273 XCHAR( -1, col ) = 196;
274 XCHAR( HEIGHT, col ) = 196;
278 CHAR( -1, WIDTH ) = 191;
279 CHAR( HEIGHT, -1 ) = 192;
280 CHAR( HEIGHT, WIDTH ) = 217;
281 XCHAR( -1,-1 ) = 218;
282 XCHAR( -1, WIDTH ) = 191;
283 XCHAR( HEIGHT, -1 ) = 192;
284 XCHAR( HEIGHT, WIDTH ) = 217;
288 void mclear( short n )
294 for (row=0; row<HEIGHT; row++ )
295 for (col=0; col<WIDTH; col++ ) {
311 for (row=-1; row<HEIGHT+1; row++ )
312 for (col=-1; col<WIDTH+1; col++ ) {
324 void mrefresh(short n)
330 for (row=-1; row<HEIGHT+1; row++ )
331 for (col=-1; col<WIDTH+1; col++ ) {
332 CHAR(row,col) = XCHAR(row,col);
333 ATTR(row,col) = XATTR(row,col);
336 msetcursor( ROW+CROW, COL+CCOL );
341 int mono_present(); //return true if mono monitor in system
344 void mopen( short n, short row, short col, short width, short height, char * title )
348 if (! mono_present()) return; //error! no mono card
358 for (row=-1; row<HEIGHT+1; row++ )
359 for (col=-1; col<WIDTH+1; col++ ) {
368 _mprintf( n, title );
370 msetcursor( ROW+CROW, COL+CCOL );
375 #pragma aux mono_present value [eax] modify [bx] = \
386 int mono_present() { return 0; }
392 static int initialized=0;
395 if (! mono_present()) return 0; //error! no mono card
402 monoscreen = (struct mono_element (*)[25][80])0xB0000;
415 for (n=1; n<MAX_NUM_WINDOWS; n++ ) {
425 return -1; //everything ok