?
So, das mit den 2 Character sets sollte folgendermaßen gehen:
(ungetestet, daher keine Garantie )
Proc Enable512Charset NEAR
cli
mov dx,03DAh
in al,dx ;reset Address/Attribute FlipFlop
mov dx,03C4h
mov al,04h
out dx,al ;select sequencer register 04: memory mode register
inc dx
in al,dx ;read contents
or al,00000010b ;Enable EM (Extended Memory) @Bit1
mov ah,al
mov dx,03DAh
in al,dx ;reset...
mov dx,03C4h
mov al,04h ;select sequencer register 04: memory mode register
out dx,ax ;and write back to 03C5 (ah)
mov dx,03DAh
in al,dx ;reset...
mov dx,03C4h
;Bit76 =00xxxxxx (reserved)
;Bit532=xx0x00xx (Address of Charmap A=>1st 8KB of plane2 @A0000)
;Bit410=xxx0xx01 (Address of Charmap B=>3rd 8KB of plane2 @A0000)
mov ax,0103h
out dx,al ;select sequencer register 03: Character Map Select Register (al)
;write data in ah (map select sa.)
sti
ret
ENDP Enable512Charset
Nun muss natürlich noch dafür gesorgt werden, dass an den entsprechenden Addressen auch eine vernuenftige character map liegt...
Dazu sollte man vielleicht noch wissen, wie so eine Character map aufgebaut ist:
Es handelt sich hier um simple Bitmaps (also 1Pixel=1Bit) Bit0=Pixel OBEN RECHTS Bit1 ist das Pixel links daneben usw.
Ein character ist insgesamt 20h Byte groß.
Um Zugriff auf die character map zu bekommen, muß noch folgender code ausgefuehrt werden:
Proc EnableCharMapAccess NEAR
cli
mov dx,03DAh
in al,dx ;reset Address/Attribute FlipFlop
mov dx,03C4h
mov ax,0402h ;select sequencer register 02: Map Mask Register (al)
out dx,ax ;Enable map2 (character maps):Bit2 of ah set
mov dx,03DAh
in al,dx ;reset...
mov dx,03C4h
mov ax,0604h ;select sequencer register 04: Memory Mode Register
out dx,ax ;Enable EM(Bit1=>extend memory access 256K) and disable OE(Bit2=>bitmaps addressed through map mask)
mov dx,03DAh
in al,dx ;reset...
mov dx,03CEh
mov ax,0005h
out dx,ax ;select graphics controller register 05: Graphics Mode Register
;disable 256color;disable O/E;RM=direct;WR=rotate0
mov dx,03DAh
in al,dx ;reset...
mov dx,03CEh
mov ax,0406h ;select graphics controller register 06: Miscellaneous Register
;O/E: A0=0/1;disable Graphics mode;map active maps to A000:0000 - 64KB
out dx,ax
mov dx,03DAh
in al,dx ;reset...
mov dx,03CEh
mov ax,0204h ;select graphics controller register 04: Read Map Select Register
out dx,ax ;select map 02 (character map)
sti
ret
ENDP EnableCharMapAccess
Wenn diese Proc ausgefuehrt wurde, ist kein Zugriff auf den Textspeicher bei B800:0000 mehr moeglich.
Daher nachdem die character maps fertig manipuliert wurden noch das hier ausfuehren:
Proc DisableCharMapAccess NEAR
cli
mov dx,03DAh
in al,dx ;reset Address/Attribute FlipFlop
mov dx,03C4h
mov ax,0302h ;select sequencer register 02: Map Mask Register (al)
out dx,ax ;Enable map0/1 (Character/Attribute maps):Bit0/1 of ah set
mov dx,03DAh
in al,dx ;reset...
mov dx,03C4h
mov ax,0204h ;select sequencer register 04: Memory Mode Register
out dx,ax ;Enable EM(Bit1=>extend memory access 256K) and OE(Bit2=>bitmaps addressed through A0: select 1/0)
mov dx,03DAh
in al,dx ;reset...
mov dx,03CEh
mov ax,1005h
out dx,ax ;select graphics controller register 05: Graphics Mode Register
;disable 256color;ENABLE O/E;RM=direct;WR=rotate0
mov dx,03DAh
in al,dx ;reset...
mov dx,03CEh
mov ax,0E06h ;select graphics controller register 06: Miscellaneous Register
;O/E: A0=1/0;disable Graphics mode;map active maps to B800:0000 - 32KB
out dx,ax
mov dx,03DAh
in al,dx ;reset...
mov dx,03CEh
mov ax,0004h ;select graphics controller register 04: Read Map Select Register
out dx,ax ;select map 00/01 (chained maps0/1: character/Attribute)
sti
ret
ENDP DisableCharMapAccess
Wie gesagt, keine Garantie ob der ganze Murx funzt.
Vielleicht ist es ja trotzdem noch irgendwie brauchbar.