@@ -50,9 +50,13 @@ static cell make_cell(int style, char c) {return (style << 8) | (0xff & c);}
5050static char cell_char (cell c ) {return c & 0xff ;}
5151static int cell_style (cell c ) {return c >> 8 ;}
5252
53+ #define UPPER_SCREEN_BUFF_SIZE 256
5354#define SCREEN_BUFF_SIZE 8192
54- static char screen_buffer [SCREEN_BUFF_SIZE ];
55+ static char screen_buffer [SCREEN_BUFF_SIZE ]; // aka window 0 (lower screen)
56+ static char upper_screen_buffer [UPPER_SCREEN_BUFF_SIZE ]; // aka window 1 (upper screen)
57+
5558char * screen_buffer_ptr = screen_buffer ;
59+ char * upper_screen_buffer_ptr = upper_screen_buffer ;
5660
5761/* A cell's style is REVERSE_STYLE, normal (0), or PICTURE_STYLE.
5862 * PICTURE_STYLE means the character is part of an ascii image outline
@@ -114,7 +118,12 @@ int os_string_width (const zchar *s)
114118
115119void os_set_cursor (int row , int col )
116120{
117- cursor_row = row - 1 ; cursor_col = col - 1 ;
121+ //printf("\n--> win:%d\trow:%d\tcol:%d MAX_COLS:%d<--\n", cwin, row, col, h_screen_cols);
122+ if (cwin == 1 && row == 1 ) {
123+ upper_screen_buffer_ptr = upper_screen_buffer + (col - 1 );
124+ }
125+
126+ cursor_row = row - 1 ; cursor_col = col - 1 ; // 0-index
118127 if (cursor_row >= h_screen_rows )
119128 cursor_row = h_screen_rows - 1 ;
120129}
@@ -148,9 +157,16 @@ void os_set_text_style(int x)
148157/* put a character in the cell at the cursor and advance the cursor. */
149158static void dumb_display_char (char c )
150159{
151- if ((screen_buffer_ptr - screen_buffer ) < (SCREEN_BUFF_SIZE - 1 )) {
152- * screen_buffer_ptr ++ = c ;
153- }
160+ if (cwin == 1 && cursor_row == 0 ) {
161+ if ((upper_screen_buffer_ptr - upper_screen_buffer ) < (UPPER_SCREEN_BUFF_SIZE - 1 )) {
162+ * upper_screen_buffer_ptr ++ = c ;
163+ }
164+ }
165+ else {
166+ if ((screen_buffer_ptr - screen_buffer ) < (SCREEN_BUFF_SIZE - 1 )) {
167+ * screen_buffer_ptr ++ = c ;
168+ }
169+ }
154170}
155171
156172void dumb_display_user_input (char * s )
@@ -210,7 +226,7 @@ void os_display_string (const zchar *s)
210226 }
211227}
212228
213- void os_erase_area (int top , int left , int bottom , int right , int UNUSED ( win ) )
229+ void os_erase_area (int top , int left , int bottom , int right , int win )
214230{
215231 int row , col ;
216232 top -- ; left -- ; bottom -- ; right -- ;
@@ -222,9 +238,16 @@ void os_erase_area (int top, int left, int bottom, int right, int UNUSED (win))
222238
223239void os_scroll_area (int top , int left , int bottom , int right , int units )
224240{
225- if ((screen_buffer_ptr - screen_buffer ) < (SCREEN_BUFF_SIZE - 1 )) {
226- * screen_buffer_ptr ++ = '\n' ;
227- }
241+ if (cwin == 1 ) {
242+ if ((upper_screen_buffer_ptr - upper_screen_buffer ) < (UPPER_SCREEN_BUFF_SIZE - 1 )) {
243+ * upper_screen_buffer_ptr ++ = '\n' ;
244+ }
245+ }
246+ else {
247+ if ((screen_buffer_ptr - screen_buffer ) < (SCREEN_BUFF_SIZE - 1 )) {
248+ * screen_buffer_ptr ++ = '\n' ;
249+ }
250+ }
228251}
229252
230253int os_font_data (int font , int * height , int * width )
@@ -557,6 +580,25 @@ void dumb_clear_screen(void) {
557580 screen_buffer_ptr = screen_buffer ;
558581}
559582
583+
584+ char * dumb_get_lower_screen (void ) {
585+ * screen_buffer_ptr = '\0' ;
586+ return screen_buffer ;
587+ }
588+
589+ void dumb_clear_lower_screen (void ) {
590+ screen_buffer_ptr = screen_buffer ;
591+ }
592+
593+ char * dumb_get_upper_screen (void ) {
594+ upper_screen_buffer [UPPER_SCREEN_BUFF_SIZE - 1 ] = '\0' ;
595+ return upper_screen_buffer ;
596+ }
597+
598+ void dumb_clear_upper_screen (void ) {
599+ upper_screen_buffer_ptr = upper_screen_buffer ;
600+ }
601+
560602void dumb_free (void ) {
561603 if (screen_data ) {
562604 free (screen_data );
0 commit comments