News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Text screen swap

Started by dncprogrammer, December 31, 2006, 10:45:32 PM

Previous topic - Next topic

dncprogrammer

Hey all,
Im working on a simple, text mode, single screen program where I would like to be able to pop up an overlaping window or text for a "yes/no" kinda prompt and when it is satisfied I would like to return the screen to whatever it was before. Is this a movsb kinda thing for the whole screen into maybe the page 1 buffer and then reverse it to page 0 when done?
jon

HAPPY NEW YEAR.. a touch in advance..!!

MichaelW

The method I would use would be to preserve the current image by leaving it intact on the current page and display the new window on the next page. I would first copy the current page to the next page so the window background would appear unchanged when that page was made visible. I would complete as much of the next page as possible before I made it visible. Doing so would avoid problems with flicker/tearing by taking advantage of the automatic synchronization with vertical retrace that AFAIK all recent adapters perform before switching the visible page. To clear the window you would just switch the visible page back to the previous page.
eschew obfuscation

dncprogrammer

Ok,
How do I determine the starting address of the pages?
2000bytes each, right? 80x25
Use direct memory transfer to copy the page and then I can use BIOS or whatever to do my
page 1 generation and BIOS to display the page. Ok?

mov           ax, es                          ;same seg, keep it simple
mov           ds, ax
mov           si, page1_adr                ; 0B800h ? something like this
mov           di, page2_adr               ; 0BFD0h ? something like this
mov           cx, 2000                      ; 2000 bytes per page
rep            movsb                         ;  copy ds:si to es:di until cx = 0

mov           ah, 0eh                       ; teletype 20 Z's
mov           bh, 01h                       ; to the hidden page 1
mov           al, 'Z'
mov           cx, 20
int             10h

mov           ah, 05h                       ; change page and wait for keypress
mov           bl,  01h                       ; page 1
int             10h

; key is pressed

mov           ah, 05h                        ; after keypress switch
mov           al, 00h                         ; back to page 0
int             10h

looks ok? Michael, I like the idea of modifying the saved page (hidden) and then displaying it when it's "ready" instead of
making a scanning mess, as well as a delay, on the current page. jon

dncprogrammer

daah! 2000 words / page!

mov           si, 0b000h               ; 4000 bytes / page
mov           di, 0b8FA0h
mov           cx, 2000
movsw       rep


MichaelW

In the 80x25 character-mode there are 2000 character bytes (at the even addresses) and 2000 attribute bytes (at the odd addresses), but each page actually occupies 4096 bytes, with 96 unused bytes at the end of the page. So the starting offset address for page N would be computed as N*4096.
eschew obfuscation

japheth

> So the starting offset address for page N would be computed as N*4096

this might not work for all BIOSes. The start of current video page should be read from location 40h:4Eh

If you want to be 100% safe, the CRT must be read directly (3D4h/3B4h, index 0Ch+0Dh). This is VGA standard and is emulated correctly in all DOS boxes I know of. The value read from these ports must be multiplied by 2 for the standard text modes.

MichaelW

Quotethis might not work for all BIOSes
Yes, I should have qualified my statement with "For a standard VGA". I have never encountered an adapter where the pages were a non-standard size, but I know that during the transition from EGA to VGA there were many non-standard adapters produced.

eschew obfuscation

japheth

> Yes, I should have qualified my statement with "For a standard VGA".

Even with VGA it might be a problem assuming a page size of 1000h. What about other modes than 80x25:

80x50 (720x400, 8 pixel font)
80x34 (640x480, 14 pixel font)
80x60 (640x480, 8 pixel font)

all three modes require more than 4096 bytes for a page. All are perfectly legal with standard VGA.


MichaelW

Quote
80x50 (720x400, 8 pixel font)
80x34 (640x480, 14 pixel font)
80x60 (640x480, 8 pixel font)

I specified 80x25 character-mode, meaning 80x25, 720x400, with a 9x16 character box. Programming at a register level there is probably some way to bastardize these specs, but AFAIK a "standard" VGA BIOS only does these specs one way. In any case, I doubt that these details are of any use to the OP.
eschew obfuscation

sinsi

In 80x25/28/43/50 modes, 0000:044c has the screen memory length in bytes and 0000:044e has the screen memory offset (b800:xxxx).
The memory length seems to be the length of chars+attrs plus one line (e.g. 80x26), presumably for scrolling cleanly.

80x60 is usually(?) a VESA mode, so getting the VESA mode info should tell you addresses, although the BDA addresses above should be correct.
Light travels faster than sound, that's why some people seem bright until you hear them.

japheth

> In any case, I doubt that these details are of any use to the OP.

Yes, might be, but then it won't be the first thread which slightly gets off topic.

> I specified 80x25 character-mode, meaning 80x25, 720x400, with a 9x16 character box

I see, sorry, I overlooked that.

> Programming at a register level there is probably some way to bastardize these specs

No, 80x50 can be set at the BIOS level: set video mode 3, then choose 8x8 font.

> 80x60 is usually(?) a VESA mode

No, it works on any VGA: setting 640x480 resolution, 8 pixel character width and 14 pixel font size.

dncprogrammer

Ok gentlemen,
I took a stab at the screen swap. I wrote 2 subs, one swaps to page 1 the other swaps from page 1 back to 0. Scramble!! Im not sure what happened.

ScrnSwap1:  push regs     
                  ds:si             0b800:0000
                  es:di            0b800:1000h                 ; 4096 bytes
                  mov             cx, 2047                       ; 4096 words starting at 0
                  rep              movsw
                  pop regs

The screen gets a little funky but when I run sub 2 (opposite of sub 1) the screen comes back and looks fine. Then I get some strange results after that. I must be close here?
jon

dncprogrammer

by the way, i pulled my BIOS 40:4c and it shows 1000h, good. I pulled also my BIOS 40:4e and it shows 0000h. So page 0 is addressed as 0b800:0000 - 0b800:1000. And page 1 should be 0b800:1000 - 0b800:2000... ok?

MichaelW

Everything looks OK, except the 2047 should be 2048. The instruction will move CX words independent of the starting address.

FWIW, on my Windows 2000 system the BIOS functions (tested 0A and 0F only) can write only to page zero. I suspect that this is a limitation of the NTVDM, and that it probably also affects XP.
eschew obfuscation

MichaelW

Quote
> Programming at a register level there is probably some way to bastardize these specs

No, 80x50 can be set at the BIOS level: set video mode 3, then choose 8x8 font.

By "bastardize" I meant some way to implement 80x25, 720x400, 9x16 character box with a non-standard page size and/or starting address.

eschew obfuscation