[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]
{
> I have always addressed $B800 as the screen segment for
> direct video writes in text.... Err, umm, does anyone have
> the code to detect whether it is $B000 or $B800 (for
> Herc.'s and the like)...
I know you didn't ask for this, but...
If you're on a EGA or better, this code should FORCE the screen segment to be
at whereever you want even if it's a mono mode!
BEGIN QUOTE OF CONVERSATION WITH 'NEON PROPHET' WHOEVER THAT IS
>>Not sure what you mean here. Do you mean to use A000:0 for
>>both text & graphics if you know it's an e/vga card?
>
>Yes, I mean I want to write to a text screen by accessing memory at
>$A000:0 on an EGA+
that's easy..
Send a 6 to port 3CEh
then in / out with port 3CFh (you gotta do this latching). Bitmaped :
bit 0 Graphics mode = 1
Textmode = 0
bit 1 Chain Odd Maps To Even Maps (who knows.. :( )
bits 2 - 3 memory map / size
00 A000 128k <-dangerous
01 A000 64K <-ok
10 B000 32k
11 B800 32k
bits 4 - 7 Unused
a quick note being that I haven't tested using A000 for text. But I suppose
using mov ax, 3 / int 10h and then switching this register would work. Never
set the first one if you are using QEMM. You *WILL* lock up the machine
because it uses some of that space for memory addressing.
Example code :
mov dx, 3CEH
mov al, 06h
out dx, al
inc dx
in al, dx
and al, 00001100b
shr al, 1
shr al, 1
now, the current state of memory should be in AL.
Hope this helps.
END QUOTE
and so do I. Haven't had a chance to try it yet.
But this should set up B800 even on a mono system (please let me know if it
works)
}
procedure initB800SegText;begin
asm mov ax,3; int 10h; end;
port[$3CE]:=2 or (3 shl 2);
if port[$3CF]=0 then; {read to latch}
end;
procedure initA000SegText;begin
asm mov ax,3; int 10h; end;
port[$3CE]:=2 or (1 shl 2);
if port[$3CF]=0 then; {read to latch}
end;
{ this should report the current segment being used. }
function segAddr:word;
const table:array[0..3]of word=($A000,$A000,$B000,$B800); begin
segAddr:=table[(port[$3CF]shr 2)and 3];
end;
{
I don't believe any of these will work on a MDA or CGA, especially not the one
for A000. I don't think they have that register...
}
[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]