(8959) Fri 8 Oct 93 11:13p By: Mike Melanson To: Ken Chick Re: VGA scroll(graphics) St: 7202<>8960 --------------------------------------------------------------------------- @MSGID: 1:128/60.0 2cb6568a Hey Ken, I'll expound on my last message: Remember that in order to change the starting address you must send the high byte of the starting address to index 0Ch of the CRTC (3D4h) and the low byte to index 0Dh of the same address. A useful way to implement vertical scrolling goes something like this: 1) Push the initial line value onto the stack. 2) Pop the value into AX. 3) Add a row to the value. If the screen is 80 bytes wide then add 80 to the value. 4) Push the value back onto the stack. 5) Since the high byte is already in AH and ready to be ported just place 0Ch into AL and send it to port 3D4h. 6) Pop the value back into AX and push a copy immediately back onto the stack because it needs to be preserved. 7) Since the low byte needs to be in AH exchange AL and AH. 8) Place the proper index, 0Dh, into AL and send the thing to port 3D4h. 9) For later repetitions, don't re-initialize the offset to 0000h. Therefore, start with step 2. Here's a small example which assumes a screen with a logical width of 80 bytes: mov dx,3D4h ;the CRTC index mov ax,0 ;the initial starting offset push ax ;preserve the initial value loop: pop ax ;pop the current starting offset add ax,80 ;add another row push ax ;preserve the current offset mov al,0Ch ;the high byte starting offset index out dx,ax ;port the high byte pop ax ;get the current row push ax ;copy the current row back to preservation xchg al,ah ;move the low byte to AH to be ported mov al,0Dh ;the low byte starting offset index out dx,ax ;port the low byte That will tell the video card to start scanning at a new offset. Horizontal panning is a little tougher as I'll explain in my next message. Hope this helps... -Mike --- Maximus/2 2.01wb * Origin: The Programmers Playhouse (1:128/60) @PATH: 128/60 103/100 209/209 270/101 260/1 362 --------------------------------------------------------------------------- (8960) Fri 8 Oct 93 11:15p By: Mike Melanson To: Ken Chick Re: VGA scroll(graphics) St: <8959 --------------------------------------------------------------------------- @MSGID: 1:128/60.0 2cb6571e Hey Ken, Horizontal panning can be implemented using precisely the same method that I presented for vertical panning, only the offset must be incremented or decremented by 1 rather than a full row's worth of pixels. However, there are 2 problems with this: 1) The screen will pan by a chunk of 8 pixels, resulting in rather choppy scrolling and 2) The screen will wraparound. The second problem is the easiest to solve: Redefine the logical screen width by porting the number of words the screen should be to the logical screen width register, index 13h, of the CRTC, 3D4h. To make the logical screen width twice the width of the visible screen width, 640 pixels 640 pixels is 80 bytes, 80 bytes is 40 words and 40 words * 2 = 80 words, so send 80 to the screen width register. To scroll through the intermediate pixels the panning register, index 13h, on the attribute controller, 3C0h, must be used. I've never gotten this to work directly so I have to use the BIOS service for this particular func- tion. To use INT 10h for this the following parameters must be passed: AX=1000h BL=13h BH={number of pixels within byte to be scrolled} Let's attempt an explanation through ASCII graphic illustration: Here's the first 2 bytes of VRAM: [X X X X X X X X] [X X X X X X X X] 0000h 0001h By default, the monitor begins scanning at the first bit of the first byte: | [X X X X X X X X] [X X X X X X X X] 0000h 0001h When told to start scanning at the offset 0001h it starts here: | [X X X X X X X X] [X X X X X X X X] 0000h 0001h When told to pan 3 individual pixels it starts scanning here: | [X X X X X X X X] [X X X X X X X X] 0000h 0001h But if the monitor is told to pan 8 pixels it will start scanning here: | [X X X X X X X X] [X X X X X X X X] 0000h 0001h instead of at the beginning of the next byte. To start scanning at the next byte tell the card to scan at byte 0002h and at the 0th bit. Well, I hope I've given you a somewhat decent primer to graphic scroll- ing on the VGA. You know where to write for further questions...:) Hope this helps... -Mike --- Maximus/2 2.01wb * Origin: The Programmers Playhouse (1:128/60) @PATH: 128/60 103/100 209/209 270/101 260/1 362