Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.asm.x86    |    Ahh, the lost art of x86 assembly    |    4,675 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 3,978 of 4,675    |
|    Terje Mathisen to All    |
|    Re: using rep movsw instruction to move     |
|    05 Dec 19 08:02:32    |
      From: terje.mathisen@nospicedham.tmsw.no              bilsch01 wrote:       > 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       > works fine:       >       > mov ax,0xb800       > mov ds,ax       > mov es,ax       > mov cx,1680       > mov si,160       > mov di,0       > rep movsw       >       > 2. I tried the code below to move the displayed document text down one       > line:       >       > mov ax,0xb800       > mov ds,ax       > mov es,ax       > mov cx,1680       > mov si,3200       > mov di,3360       > rep movsw       >       > 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       screen memory.              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              --       - |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca