Post by bilsch01
My program uses 4000 bytes at segment 0xb800 for text mode display. The
bottom 3 lines of the screen (160 bytes of memory per line) are static
display and are not to be moved. Bytes 0 thru 3519 contain part of a
text document and are the area to be moved up/down.
1. The code below moves the displayed document text up one line. It
It moves the line beginning at b800:3200 down one line on the screen but
the lines above it are not moved down. It is unfortunate that the static
display gets overwritten, I can handle that later. I tried some
variations of the code but I wasn't able to get the entire document area
to move down one line. Can someone here tell me how to move the document
area down one line.
TIA. Bill S.
This is the classic overlapping move problem. :-)
You have recognized it partially, in that you are pointing at hte end of
the buffer areas instead of the beginning, but you have failed to issue
a STD (Set Direction bit, vs CLD which is the default).
However, the real issue here is the fact that you should NOT move text
around on a classic PC screen at all! Instead you maintain an off-screen
buffer and then you use REP MOVSW to copy the relevant parts into the
This is because the screen buffer is/was 3-10 times slower than normal
RAM, so it was far faster to do all updates off-screen and then copy in
the finished screen.
In my own code I used a list of line buffers for that off-screen
display, so that I could do partial scrolling with just a few pointer
updates, before using REP MOVSW on individual lines to copy them to the
correct screen location.
If you have the original CGA screen then you also need to worry about
screen flicker if you write to the CGA memory while the screen is being
refreshed! You can copy at least 1-4 lines (afair) of data in the
vertical retrace interval and a few characters in each horizontal
retrace if you need to.
- <Terje.Mathisen at tmsw.no>
"almost all programming can be viewed as an exercise in caching"