1883 lines
57 KiB
PHP
1883 lines
57 KiB
PHP
|
||
ASSUME CS:CODE, DS:CODE, ES:DATA
|
||
if WINNT
|
||
;------------------------------------------------------------------------
|
||
EgaMAllModeTbl db 7, 40h, 70h, -1
|
||
EgaCAllModeTbl db 0, 1, 2, 3, 40h, 70h, 60h, -1
|
||
McgaAllModeTbl label byte
|
||
VgaAllModeTbl db 0, 1, 2, 3, 7, 40h, 70h
|
||
db 60h, -2
|
||
|
||
EgaModeTbl label byte
|
||
db 03h,0*2,03h,0b8h,0b8h,10h,000h,01001000b,25 ; han
|
||
dw 0, offset Mode3E,0d0eh
|
||
db 83h,4*2,12h,0b8h,0a0h,10h,080h,11001101b,25 ; single
|
||
dw (31-18)*64, offset Mode3Ega,0d0eh
|
||
db 93h,4*2,12h,000h,0b8h,00h,080h,01000101b,25 ; dual
|
||
dw (31-18)*64, offset Mode3Ega,0d0eh
|
||
db 07h,0*2,07h,0b0h,0b0h,10h,000h,00001000b,25 ; han
|
||
dw 0, offset Mode7,0d0eh
|
||
db 87h,3*2,0fh,0b0h,0b8h,10h,080h,10001100b,25 ; single
|
||
dw (32-17)*64, offset Mode7Ega,0d0eh
|
||
db 97h,3*2,0fh,000h,0b0h,00h,080h,00000100b,25 ; dual
|
||
dw (32-17)*64, offset Mode7Ega,0d0eh
|
||
db 40h,5*2,12h,000h,0b8h,00h,080h,01100100b,25 ;
|
||
dw (24-18)*64, offset Mode40E,2e0fh
|
||
db 70h,5*2,0fh,000h,0b0h,00h,080h,00100100b,25 ;
|
||
dw (25-17)*64, offset Mode70E,2e0fh
|
||
db 60h,6*2,12h,000h,0a0h,00h,080h,01100000b,25 ;
|
||
dw (23-18)*64, offset Mode60E,0000h
|
||
|
||
VgaModeTbl label byte
|
||
db 03h,0*2,03h,0b8h,0b8h,10h,000h,01001000b,25 ; han
|
||
dw 0, offset Mode23,0d0eh
|
||
db 83h,4*2,03h,0b8h,0a0h,10h,080h,11001101b,25 ; single
|
||
dw (29-18)*64, offset Mode3V,0d0eh
|
||
db 93h,4*2,03h,000h,0b8h,00h,080h,01000101b,25 ; dual
|
||
dw (29-18)*64, offset Mode3V,0d0eh
|
||
db 07h,0*2,07h,0b0h,0b0h,10h,000h,00001000b,25 ; han
|
||
dw 0, offset Mode07,0d0eh
|
||
db 87h,3*2,0fh,0b0h,0a8h,10h,080h,10001100b,25 ; single
|
||
dw (30-17)*64, offset Mode07V,0d0eh
|
||
db 97h,3*2,0fh,000h,0b0h,00h,080h,00000100b,25 ; dual
|
||
dw (30-17)*64, offset Mode07V,0d0eh
|
||
db 40h,5*2,12h,000h,0b8h,00h,080h,01100100b,25 ;
|
||
dw (9-18)*64, offset Mode40,2e0fh
|
||
db 70h,5*2,0fh,000h,0b0h,00h,080h,00100100b,25 ;
|
||
dw (10-17)*64, offset Mode70,2e0fh
|
||
db 60h,6*2,12h,000h,0a0h,00h,080h,01100000b,25 ;
|
||
dw (8-18)*64, offset Mode60,0000h
|
||
db 11h,6*2,11h,000h,0a0h,00h,0a0h,01100000b,30 ;
|
||
dw 0, offset Mode11,0000h
|
||
db 12h,6*2,12h,000h,0a0h,00h,0a0h,01100000b,30 ;
|
||
dw 0, offset Mode12,0000h
|
||
else
|
||
;------------------------------------------------------------------------
|
||
EgaMAllModeTbl db 7, 0fh, 40h, 70h, -1
|
||
EgaCAllModeTbl db 0, 1, 2, 3, 4, 5, 6, 0dh, 0eh, 10h, 40h, 70h, 60h, -1
|
||
McgaAllModeTbl label byte
|
||
VgaAllModeTbl db 0, 1, 2, 3, 4, 5, 6, 7, 0dh, 0eh, 0fh, 10h, 40h, 70h
|
||
db 60h, 10h, 11h, 12h, 13h, -2
|
||
|
||
EgaModeTbl label byte
|
||
db 03h,0*2,03h,0b8h,0b8h,10h,000h,01001000b,25 ; han
|
||
dw 0, offset Mode3E,0d0eh
|
||
db 83h,4*2,10h,0b8h,0a0h,10h,080h,11001101b,25 ; single
|
||
dw (31-18)*64, offset Mode3Ega,0d0eh
|
||
db 93h,4*2,10h,000h,0b8h,00h,080h,01000101b,25 ; dual
|
||
dw (31-18)*64, offset Mode3Ega,0d0eh
|
||
db 07h,0*2,07h,0b0h,0b0h,10h,000h,00001000b,25 ; han
|
||
dw 0, offset Mode7,0d0eh
|
||
db 87h,3*2,0fh,0b0h,0b8h,10h,080h,10001100b,25 ; single
|
||
dw (32-17)*64, offset Mode7Ega,0d0eh
|
||
db 97h,3*2,0fh,000h,0b0h,00h,080h,00000100b,25 ; dual
|
||
dw (32-17)*64, offset Mode7Ega,0d0eh
|
||
db 40h,5*2,10h,000h,0b8h,00h,080h,01100100b,25 ;
|
||
dw (24-18)*64, offset Mode40E,2e0fh
|
||
db 70h,5*2,0fh,000h,0b0h,00h,080h,00100100b,25 ;
|
||
dw (25-17)*64, offset Mode70E,2e0fh
|
||
db 60h,6*2,10h,000h,0a0h,00h,080h,01100000b,25 ;
|
||
dw (23-18)*64, offset Mode60E,0000h
|
||
|
||
VgaModeTbl label byte
|
||
db 03h,0*2,03h,0b8h,0b8h,10h,000h,01001000b,25 ; han
|
||
dw 0, offset Mode23,0d0eh
|
||
db 83h,4*2,10h,0b8h,0a0h,10h,080h,11001101b,25 ; single
|
||
dw (29-18)*64, offset Mode3V,0d0eh
|
||
db 93h,4*2,10h,000h,0b8h,00h,080h,01000101b,25 ; dual
|
||
dw (29-18)*64, offset Mode3V,0d0eh
|
||
db 07h,0*2,07h,0b0h,0b0h,10h,000h,00001000b,25 ; han
|
||
dw 0, offset Mode07,0d0eh
|
||
db 87h,3*2,0fh,0b0h,0a8h,10h,080h,10001100b,25 ; single
|
||
dw (30-17)*64, offset Mode07V,0d0eh
|
||
db 97h,3*2,0fh,000h,0b0h,00h,080h,00000100b,25 ; dual
|
||
dw (30-17)*64, offset Mode07V,0d0eh
|
||
db 40h,5*2,10h,000h,0b8h,00h,080h,01100100b,25 ;
|
||
dw (9-18)*64, offset Mode40,2e0fh
|
||
db 70h,5*2,0fh,000h,0b0h,00h,080h,00100100b,25 ;
|
||
dw (10-17)*64, offset Mode70,2e0fh
|
||
db 60h,6*2,10h,000h,0a0h,00h,080h,01100000b,25 ;
|
||
dw (8-18)*64, offset Mode60,0000h
|
||
db 11h,6*2,11h,000h,0a0h,00h,0a0h,01100000b,30 ;
|
||
dw 0, offset Mode11,0000h
|
||
db 12h,6*2,12h,000h,0a0h,00h,0a0h,01100000b,30 ;
|
||
dw 0, offset Mode12,0000h
|
||
endif
|
||
|
||
;------------------------------------------------------------------------
|
||
ModeSetVgaText:
|
||
call ClearGrpBuf
|
||
if KseVga
|
||
test [KseCard],00000001b
|
||
jz @f
|
||
call ChgParmH2E
|
||
@@:
|
||
endif ; if KseVga
|
||
pushf
|
||
call [OldVideo]
|
||
if KseVga
|
||
test [KseCard],00000001b
|
||
jz @f
|
||
call ChgParmE2H
|
||
@@:
|
||
endif ; if KseVga
|
||
call LoadEngPattern
|
||
jmp short CrtProgram
|
||
ModeSetVgaGrp:
|
||
call ClearGrpBuf
|
||
if WINNT
|
||
pushf
|
||
call [OldVideo]
|
||
call LoadEngPattern
|
||
else
|
||
mov di,word ptr [HanSavePtr]
|
||
add di,[si+sAdjParms]
|
||
xchg di,word ptr [HanSavePtr]
|
||
pushf
|
||
call [OldVideo]
|
||
xchg di,word ptr [HanSavePtr]
|
||
endif
|
||
CrtProgram:
|
||
if KseVga
|
||
test [KseCard],00000001b
|
||
jz @f
|
||
call KseVgaKey
|
||
@@:
|
||
endif ; if KseVga
|
||
push si
|
||
call OffScreen
|
||
mov si,[si+sParms]
|
||
mov dx,GrpIndex
|
||
mov ah,[si].cMap
|
||
mov al,6
|
||
out dx,ax
|
||
mov dl,(MiscReg AND 0ffh)
|
||
mov al,[si].cMisc
|
||
out dx,al
|
||
mov dl,0d4h
|
||
test al,00000001b
|
||
jnz @f
|
||
mov dl,0b4h
|
||
@@:
|
||
mov [rAddr6845],dx
|
||
add si,cCrtc
|
||
mov cx,25
|
||
mov ax,0111h
|
||
out dx,ax ; release CRTC reg 0-7
|
||
xor ah,ah
|
||
@@:
|
||
lodsb
|
||
xchg al,ah
|
||
out dx,ax
|
||
xchg al,ah
|
||
inc ah
|
||
loop @b
|
||
test [rMiscFlags],00001000b
|
||
jnz NoWritePalet ; default palette loading is disable
|
||
add dl,0ah-4
|
||
in al,dx ; reset F/F
|
||
in al,dx ; reset F/F
|
||
mov cl,20
|
||
xor ah,ah
|
||
mov dl,(AttrReg AND 0ffh)
|
||
@@:
|
||
mov al,ah
|
||
out dx,al
|
||
lodsb
|
||
out dx,al
|
||
inc ah
|
||
loop @b
|
||
mov al,3fh
|
||
out dx,al ; enable screen
|
||
NoWritePalet:
|
||
call OnScreen
|
||
pop si
|
||
ret
|
||
ClearGrpBuf:
|
||
test [CurMode],10000000b
|
||
jnz @f
|
||
cmp [si].sModeId,5*2 ; EGA/VGA mode 40, 70
|
||
jnz @f
|
||
push ax
|
||
push es
|
||
les di,[GrpBufAddr]
|
||
mov cx,8000h/2
|
||
xor ax,ax
|
||
rep stosw
|
||
pop es
|
||
pop ax
|
||
@@:
|
||
ret
|
||
LoadEngPattern:
|
||
push es
|
||
push si
|
||
mov dx,SeqIndex
|
||
mov ax,100h ; 0100 synchronous reset
|
||
cli
|
||
out dx,ax
|
||
; inc al ; 0101 select char clock 8 dot(640x400)
|
||
; out dx,ax
|
||
mov ax,402h ; 0402 writes only to map 2
|
||
out dx,ax
|
||
mov ax,704h ; 0704 sequencial addressing
|
||
out dx,ax
|
||
mov ax,300h ; 0300 clear syncronous reset
|
||
out dx,ax
|
||
mov dl,(GrpIndex and 0ffh)
|
||
sti
|
||
mov ax,204h ; 0204 select map 2 for CPU reads
|
||
out dx,ax
|
||
mov ax,5 ; 0005 disable odd/even addressing
|
||
out dx,ax
|
||
inc ax ; 0006 map starts at A000:0000
|
||
out dx,ax
|
||
mov ax,0a000h
|
||
mov es,ax
|
||
xor di,di ; es:di = start VRAM addr of CG
|
||
push si
|
||
mov si,offset EngFont
|
||
xor dl,dl
|
||
xor ch,ch
|
||
@@:
|
||
mov cl,16
|
||
rep movsb
|
||
add di,16
|
||
inc dl
|
||
jnz @b
|
||
pop si
|
||
mov si,[si+sParms]
|
||
mov dl,(SeqIndex and 0ffh)
|
||
mov ax,100h ; 0 synchronous reset
|
||
cli
|
||
out dx,ax
|
||
inc al ; 1
|
||
; mov ah,[si+5]
|
||
; out dx,ax
|
||
inc al ; 2
|
||
mov ah,[si+6]
|
||
out dx,ax
|
||
mov al,4 ; 4
|
||
mov ah,[si+8]
|
||
out dx,ax
|
||
mov ax,300h ; 0 clear syncronous reset
|
||
out dx,ax
|
||
sti
|
||
mov dl,(GrpIndex and 0ffh)
|
||
mov al,4 ; 4
|
||
mov ah,[si+59]
|
||
out dx,ax
|
||
inc al ; 5
|
||
mov ah,[si+60]
|
||
out dx,ax
|
||
inc al ; 6
|
||
mov ah,[si+61]
|
||
out dx,ax
|
||
pop si
|
||
pop es
|
||
ret
|
||
|
||
OnScreen:
|
||
if KseVga
|
||
test [KseCard],00000001b
|
||
jz @f
|
||
test cs:[ModeStat],GrpMode
|
||
jnz @f
|
||
push dx
|
||
push ax
|
||
mov dx,3c4h
|
||
mov al,1
|
||
out dx,al
|
||
inc dl
|
||
in al,dx
|
||
and al,11011111b
|
||
out dx,al
|
||
pop ax
|
||
pop dx
|
||
@@:
|
||
endif ; if KseVga
|
||
ret
|
||
|
||
OffScreen:
|
||
if KseVga
|
||
test [KseCard],00000001b
|
||
jz @f
|
||
test cs:[ModeStat],GrpMode
|
||
jnz @f
|
||
push dx
|
||
push ax
|
||
mov dx,3c4h
|
||
mov al,1
|
||
out dx,al
|
||
inc dl
|
||
in al,dx
|
||
or al,21h
|
||
out dx,al
|
||
pop ax
|
||
pop dx
|
||
@@:
|
||
endif ; if KseVga
|
||
ret
|
||
|
||
;------------------------------------------------------------------------
|
||
; << DispEngColorMulti >>
|
||
; FUNCTION = english character multi-display in color
|
||
; INPUT : ES:AX = graphics buffer position, CX = counter, BL = attr
|
||
; DS:SI = pattern
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
; DispEngColorMulti(BL,CX,DS,SI,ES,AX/-)
|
||
; {
|
||
; if (CX = 1),DispEngColor(BL,DS,SI,ES,DI/-);
|
||
; else
|
||
; if (CX = 0), return;
|
||
; while (CX = 0, CX-)
|
||
; /* save register */
|
||
; DispEngColor(BL,DS,SI,ES,DI/-);
|
||
; /* restore register */
|
||
; /* recalc memory address */
|
||
; }
|
||
|
||
DispEngColorMulti:
|
||
cmp cx,1
|
||
jnz @f
|
||
call DispEngColor
|
||
ret
|
||
@@:
|
||
jcxz DispEngColorMultiExit
|
||
mov dl,Byte Ptr [CurPos]
|
||
DispEngColorMultiLoop:
|
||
@push ax,bx,cx,dx,si
|
||
call DispEngColor
|
||
@pop si,dx,cx,bx,ax
|
||
inc ax ; AX = DI
|
||
inc dl
|
||
cmp dl,80
|
||
jb @f
|
||
xor dl,dl
|
||
add ax,80*15
|
||
@@:
|
||
loop DispEngColorMultiLoop
|
||
DispEngColorMultiExit:
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
; << DispEngColorXorMulti >>
|
||
; FUNCTION = english character multi-display in color ( XOR )
|
||
; INPUT : ES:AX = graphics buffer position, CX = counter, BL = attr
|
||
; DS:SI = pattern
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
; DispEngColorXorMulti(BL,CX,DS,SI,ES,AX/-)
|
||
; {
|
||
; if (CX = 1),DispEngColorXor(BL,DS,SI,ES,DI/-);
|
||
; else
|
||
; if (CX = 0), return;
|
||
; while (CX = 0, CX-)
|
||
; /* save register */
|
||
; DispEngColorXor(BL,DS,SI,ES,DI/-);
|
||
; /* restore register */
|
||
; /* recalc memory address */
|
||
; }
|
||
|
||
DispEngColorXorMulti:
|
||
cmp cx,1
|
||
jnz @f
|
||
call DispEngColorXor
|
||
ret
|
||
@@:
|
||
jcxz DispEngColorXorMultiExit
|
||
mov dl,Byte Ptr [CurPos]
|
||
DispEngColorXorMultiLoop:
|
||
@push ax,bx,cx,dx,si
|
||
call DispEngColorXor
|
||
@pop si,dx,cx,bx,ax
|
||
inc ax ; AX = DI
|
||
inc dl
|
||
cmp dl,80
|
||
jb @f
|
||
xor dl,dl
|
||
add ax,80*15
|
||
@@:
|
||
loop DispEngColorXorMultiLoop
|
||
DispEngColorXorMultiExit:
|
||
ret
|
||
|
||
|
||
CheckHwScr:
|
||
mov di,ax
|
||
test cs:[ModeStat],HwScroll
|
||
jz @f
|
||
call GetCrtStartAddr
|
||
add di,ax
|
||
cmp di,80*16*25
|
||
jb @f
|
||
sub di,80*16*25
|
||
@@:
|
||
ret
|
||
;------------------------------------------------------------------------
|
||
; << DispEngColor >>
|
||
; FUNCTION = Font Image Display Routine for One Byte Font
|
||
; INPUT ES:AX = Video RAM Segment:Offset
|
||
; DS:SI = Font Data Segment:Offset
|
||
; BL = Attribute
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
;
|
||
; DispEngColor(BL,DS,SI,ES,AX/-) /* HwScroll */
|
||
|
||
DispEngColor:
|
||
call CheckHwScr
|
||
test cs:[Card1st],00000100b
|
||
jnz DispEngEgaColor
|
||
CLI
|
||
MOV DX,SeqIndex ; Sequencer Register
|
||
MOV AX,0F02h ; All Color Plane Enable
|
||
OUT DX,AX
|
||
MOV DX,GrpIndex ; Graphic Controller
|
||
MOV AX,0
|
||
OUT DX,AX
|
||
TEST CS:[ModeStat],GrpMode
|
||
JZ EngColorBackground
|
||
; Graphic Mode Only
|
||
MOV AX,0305h ; Write Mode 3 (VGA Only)
|
||
OUT DX,AX
|
||
MOV AH,0FFh
|
||
MOV ES:[DI],AH
|
||
JMP short EngColorGraphicAttr
|
||
EngColorBackground:
|
||
MOV AX,0205h ; Write Mode 2
|
||
OUT DX,AX
|
||
CALL MakeEngAttr ; BL = Attr, AL = Background Attr Return
|
||
; MOV AH,AL
|
||
MOV ES:[DI],AL
|
||
;English Color Foreround
|
||
MOV AX,0305h ; Set Write Mode 2, Read Mode 0
|
||
OUT DX,AX ; Graphic Mode Register
|
||
EngColorGraphicAttr:
|
||
MOV AH,ES:[DI] ; Set Latches From VRAM
|
||
MOV AL,0 ; Set/Reset Register
|
||
MOV AH,BL ; Character Attribute Value
|
||
OUT DX,AX
|
||
MOV BX,(50h-1)
|
||
mov cx,16
|
||
DispEngColorLoop:
|
||
MOVSB
|
||
ADD DI,BX
|
||
LOOP DispEngColorLoop
|
||
; Reset Bit Mask Register
|
||
DispHEColorRet:
|
||
MOV AX,0FF08h ; Pixel Mask All Enable
|
||
OUT DX,AX
|
||
MOV AX,005h ; Graphic Mode = 0
|
||
; test [Win31Flag],SetExtTE
|
||
; JZ @F
|
||
; MOV AH,01H
|
||
;@@:
|
||
OUT DX,AX
|
||
MOV AX,1
|
||
OUT DX,AX ; All Disable Set/Reset Register
|
||
MOV AX,0
|
||
OUT DX,AX ; Clear Set/Reset Value
|
||
STI
|
||
RET
|
||
|
||
DispEngEgaColor:
|
||
call MakeEngAttr
|
||
mov ah,al
|
||
TEST CS:[ModeStat],GrpMode
|
||
JZ @f
|
||
xor ah,ah ; background color in graphics mode
|
||
@@:
|
||
mov dx,GrpIndex ; grp ctrl index register
|
||
mov al,5 ; mode register
|
||
out dx,al
|
||
inc dx ; grp ctrl data register(=3CFh)
|
||
mov al,2 ; write mode 2
|
||
out dx,al
|
||
mov al,ah
|
||
mov cx,16 ; set repeat counter
|
||
mov dx,(80-1)
|
||
mov bp,di
|
||
VgaWriteEngSingleBgLp:
|
||
stosb ; clear 1st scan line
|
||
add di,dx ; next VRAM addr
|
||
loop VgaWriteEngSingleBgLp
|
||
mov di,bp
|
||
VgaWriteEngSingleFg:
|
||
call GetAddrGrp
|
||
mov bx,(80-1)
|
||
VgaGetFontEngSingleLp:
|
||
lodsb
|
||
out dx,al
|
||
stosb ; write 1st pattern
|
||
add di,bx ; next VRAM addr
|
||
loop VgaGetFontEngSingleLp
|
||
mov al,-1 ; default config (enable all bits)
|
||
out dx,al
|
||
dec dx ; get addr of grp ctrl index register
|
||
mov ax,1 ; get addr of grp ctrl data register
|
||
out dx,ax ; disable the set/reset register
|
||
xor ax,ax ; set/reset register
|
||
out dx,ax ; clear set/reset register value
|
||
ret
|
||
|
||
|
||
GetAddrGrp:
|
||
mov dx,GrpIndex ; get addr of grp ctrl index register
|
||
mov ax,5 ; get addr of grp ctrl data register
|
||
out dx,ax ; write mode 0
|
||
GetAddrGrpP:
|
||
mov ax,0ff01h ; get addr of grp ctrl data register
|
||
out dx,ax ; load enable set/reset value into reg
|
||
xor al,al ; set/reset register
|
||
mov ah,bl ; load set/reset value into reg
|
||
out dx,ax
|
||
mov al,es:[di] ; set latch register
|
||
mov dx,GrpIndex ; get addr of grp ctrl index register
|
||
mov al,8 ; bit mask register
|
||
out dx,al
|
||
inc dx
|
||
mov cx,16 ; set counter
|
||
ret
|
||
|
||
;------------------------------------------------------------------------
|
||
; << DispEngColorXor >>
|
||
; FUNCTION = Font Image Display Routine for One Byte Font
|
||
; INPUT ES:AX = Video RAM Segment:Offset
|
||
; DS:SI = Font Data Segment:Offset
|
||
; BL = Attribute
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
;
|
||
; DispEngColorXor(BL,DS,SI,ES,AX/-)
|
||
|
||
@@:
|
||
jmp DispEngColor
|
||
DispEngColorXor:
|
||
test bl,80h
|
||
jz @b
|
||
call CheckHwScr
|
||
CALL MakeEngAttr ; BL = Attr, AL = Background Attr Return
|
||
mov dx,GrpIndex ; get addr of grp ctrl index register
|
||
mov ax,5 ; get addr of grp ctrl data register
|
||
out dx,ax ; write mode 0
|
||
mov ax,1803h ; get addr of grp ctrl data register
|
||
out dx,ax ; data XORed with latch contents
|
||
mov ax,0ff01h ; get addr of grp ctrl data register
|
||
out dx,ax ; load enable set/reset value into reg
|
||
xor al,al ; set/reset register
|
||
mov ah,bl ; load set/reset value into reg
|
||
out dx,ax
|
||
mov dx,GrpIndex ; get addr of grp ctrl index register
|
||
mov al,8 ; bit mask register
|
||
out dx,al
|
||
inc dx
|
||
mov bx,(80-1) ; for addressing next VRAM addr
|
||
mov cx,16 ; set counter
|
||
VgaWriteEngSingleXorLp:
|
||
lodsb
|
||
out dx,al
|
||
mov al,es:[di] ; set latch register
|
||
stosb ; write 1st pattern
|
||
add di,bx ; next VRAM addr
|
||
loop VgaWriteEngSingleXorLp
|
||
VgaWriteSingleFg16Xor:
|
||
dec dx ; get addr of grp ctrl index register
|
||
mov ax,3 ; get addr of grp ctrl data register
|
||
out dx,ax ; data unmodified (off XORing)
|
||
mov al,8 ; bit mask register
|
||
out dx,al
|
||
inc dx
|
||
mov al,-1 ; default config (enable all bits)
|
||
out dx,al
|
||
dec dx ; get addr of grp ctrl index register
|
||
mov ax,1 ; get addr of grp ctrl data register
|
||
out dx,ax ; disable the set/reset register
|
||
xor ax,ax ; set/reset register
|
||
out dx,ax ; clear set/reset register value
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
; << DispHanColor >>
|
||
; FUNCTION = Font Image Display Routine for Double Byte Font
|
||
; INPUT ES:AX = Video RAM Segment:Offset
|
||
; DS:SI = Font Data Segment:Offset
|
||
; BL = Attribute
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
; DispHanColor(BL,DS,SI,ES,AX/-) /* HwScroll */
|
||
|
||
DispHanColor:
|
||
call CheckHwScr
|
||
test cs:[Card1st],00000100b
|
||
jnz DispHanEgaColor
|
||
CLI
|
||
MOV DX,SeqIndex ; Sequencer Register
|
||
MOV AX,0F02h ; All Color Plane Enable
|
||
OUT DX,AX
|
||
MOV DX,GrpIndex ; Graphic Controller
|
||
MOV AX,0
|
||
OUT DX,AX
|
||
TEST CS:[ModeStat],GrpMode
|
||
JZ HanColorBackground
|
||
; Graphic Mode Only
|
||
MOV AX,0305h ; Write Mode 3 (VGA Only)
|
||
OUT DX,AX
|
||
MOV AH,0FFh
|
||
MOV ES:[DI],AH
|
||
JMP short HanColorGraphicAttr
|
||
HanColorBackground:
|
||
MOV AX,0205h ; Write Mode 2
|
||
OUT DX,AX
|
||
CALL MakeHanAttr ; BL = Attr, AL = Background Attr Return
|
||
MOV AH,AL
|
||
MOV ES:[DI],AH
|
||
;Hanguel Color Foreround
|
||
MOV AX,0305h ; Set Write Mode 3, Read Mode 0 (VGA Only)
|
||
OUT DX,AX ; Graphic Mode Register
|
||
HanColorGraphicAttr:
|
||
MOV AH,ES:[DI] ; Set Latches From VRAM
|
||
MOV AL,0 ; Set/Reset Register
|
||
MOV AH,BL ; Character Attribute Value
|
||
OUT DX,AX
|
||
MOV BX,(50h-2)
|
||
mov cx,16
|
||
DispHanColorLoop:
|
||
MOVSW
|
||
ADD DI,BX
|
||
LOOP DispHanColorLoop
|
||
; Reset Bit Mask Register
|
||
jmp DispHEColorRet
|
||
|
||
DispHanEgaColor:
|
||
call MakeHanAttr
|
||
mov ah,al
|
||
TEST CS:[ModeStat],GrpMode
|
||
JZ @f
|
||
xor ah,ah ; background color in graphics mode
|
||
@@:
|
||
mov dx,GrpIndex ; grp ctrl index register
|
||
mov al,5 ; mode register
|
||
out dx,al
|
||
inc dx ; grp ctrl data register(=3CFh)
|
||
mov al,2 ; write mode 2
|
||
out dx,al
|
||
mov al,ah
|
||
mov cx,16 ; set repeat counter
|
||
mov dx,(80-2)
|
||
mov bp,di
|
||
VgaWriteHanSingleBgLp:
|
||
stosb ; clear 1st scan line
|
||
stosb ; clear 1st scan line
|
||
add di,dx ; next VRAM addr
|
||
loop VgaWriteHanSingleBgLp
|
||
mov di,bp
|
||
VgaWriteHanSingleFg:
|
||
call GetAddrGrp
|
||
mov bx,(80-2)
|
||
VgaGetFontHanSingleLp:
|
||
lodsb
|
||
out dx,al
|
||
stosb ; write 1st pattern
|
||
lodsb
|
||
out dx,al
|
||
stosb
|
||
add di,bx ; next VRAM addr
|
||
loop VgaGetFontHanSingleLp
|
||
mov al,-1 ; default config (enable all bits)
|
||
out dx,al
|
||
dec dx ; get addr of grp ctrl index register
|
||
mov ax,1 ; get addr of grp ctrl data register
|
||
out dx,ax ; disable the set/reset register
|
||
xor ax,ax ; set/reset register
|
||
out dx,ax ; clear set/reset register value
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
; << DispHanColorXor >>
|
||
; FUNCTION = Font Image Display Routine for Double Byte Font
|
||
; INPUT ES:AX = Video RAM Segment:Offset
|
||
; DS:SI = Font Data Segment:Offset
|
||
; BL = Attribute
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
; DispHanColorXor(BL,DS,SI,ES,AX/-)
|
||
|
||
@@:
|
||
jmp DispHanColor
|
||
DispHanColorXor:
|
||
test bl,80h
|
||
jz @b
|
||
mov di,ax
|
||
test cs:[ModeStat],HwScroll
|
||
jz @f
|
||
call GetCrtStartAddr
|
||
add di,ax
|
||
cmp di,80*16*25
|
||
jb @f
|
||
sub di,80*16*25
|
||
@@:
|
||
CALL MakeHanAttr ; BL = Attr, AL = Background Attr Return
|
||
mov dx,GrpIndex ; get addr of grp ctrl index register
|
||
mov ax,5 ; get addr of grp ctrl data register
|
||
out dx,ax ; write mode 0
|
||
mov ax,1803h ; get addr of grp ctrl data register
|
||
out dx,ax ; data XORed with latch contents
|
||
call GetAddrGrpP
|
||
mov bx,(80-2) ; for addressing next VRAM addr
|
||
VGFHSLp:
|
||
lodsb
|
||
out dx,al
|
||
mov al,es:[di] ; set latch register
|
||
stosb ; write 1st pattern
|
||
lodsb
|
||
out dx,al
|
||
mov al,es:[di] ; set latch register
|
||
stosb
|
||
add di,bx ; next VRAM addr
|
||
loop VGFHSLp
|
||
|
||
dec dx ; get addr of grp ctrl index register
|
||
mov ax,3 ; get addr of grp ctrl data register
|
||
out dx,ax ; data unmodified (off XORing)
|
||
mov al,8 ; bit mask register
|
||
out dx,al
|
||
inc dx
|
||
mov al,-1 ; default config (enable all bits)
|
||
out dx,al
|
||
dec dx ; get addr of grp ctrl index register
|
||
mov ax,1 ; get addr of grp ctrl data register
|
||
out dx,ax ; disable the set/reset register
|
||
xor ax,ax ; set/reset register
|
||
out dx,ax ; clear set/reset register value
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
; << VgaGrpScroll >>
|
||
; FUNCTION = Color Graphic Screen Scroll
|
||
; INPUT : BH = Blank line Attr
|
||
; : BL = Scroll Line count ( Y' )
|
||
; : CX = Row : Column
|
||
; : DH = Move count ( Y )
|
||
; : DL = Window width ( X )
|
||
; : BP = Next scan line
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
; VgaGrpScroll(BX,CX,DX/-)
|
||
|
||
VgaGrpScroll:
|
||
push bp
|
||
mov bp,cx
|
||
xchg cx,dx
|
||
mov ax,80*16
|
||
mov dl,dh
|
||
xor dh,dh
|
||
mul dx
|
||
mov dx,bp
|
||
xor dh,dh
|
||
add ax,dx
|
||
les di,[GrpBufAddr]
|
||
mov dl,bl
|
||
or dl,dl
|
||
jns @f
|
||
add di,80*15
|
||
@@:
|
||
add di,ax
|
||
mov si,di
|
||
mov dx,bp
|
||
mov bp,80*16
|
||
mov al,bl
|
||
xor ah,ah
|
||
mul bp
|
||
add si,ax
|
||
call HwScrollAdjust
|
||
pop bp
|
||
sar bp,1
|
||
xchg cx,dx
|
||
mov cx,dx ; save DX
|
||
mov dx,SeqIndex ; sequencer
|
||
mov ax,0f02h ; all plane enable
|
||
out dx,ax
|
||
mov dl,0ceh ; 3CEh = Graphic controller
|
||
mov ax,0003h ; function clear
|
||
out dx,ax
|
||
mov ax,0105h ; write mode 01, Latch write
|
||
out dx,ax
|
||
mov dx,cx ; restore DX
|
||
mov al,bh
|
||
test [ModeStat],GrpMode
|
||
jnz RunGrp
|
||
cmp [ModeId],2*3 ; EGA/VGA mode 7
|
||
jnz @f
|
||
mov al,0
|
||
test bh,01110111B
|
||
jz @f
|
||
mov al,1
|
||
test bh,01111000B
|
||
jz @f
|
||
mov al,bh
|
||
and al,01111000B
|
||
cmp al,00001000B
|
||
mov al,4
|
||
jz @f
|
||
mov al,10h
|
||
test bh,00000111B
|
||
jz @f
|
||
mov al,11h
|
||
test bh,00001000B
|
||
jz @f
|
||
mov al,40h
|
||
@@:
|
||
shr al,1
|
||
shr al,1
|
||
shr al,1
|
||
shr al,1
|
||
RunGrp:
|
||
mov cx,es
|
||
mov ds,cx ; ES = DS
|
||
mov cl,bl
|
||
or cl,cl
|
||
jns @f
|
||
neg bl
|
||
@@:
|
||
xor ch,ch
|
||
or dh,dh
|
||
mov bh,dl
|
||
jz ColorFill
|
||
mov dl,dh
|
||
xor dh,dh
|
||
shl dx,1
|
||
shl dx,1
|
||
shl dx,1
|
||
shl dx,1
|
||
@@:
|
||
call HwScrollAdjustI
|
||
mov cl,bh
|
||
rep movsb
|
||
add si,bp
|
||
add di,bp
|
||
dec dx
|
||
jnz @b
|
||
ColorFill:
|
||
mov dl,bh
|
||
xor bh,bh
|
||
mov cl,4
|
||
shl bx,cl
|
||
mov si,ax
|
||
mov cx,dx
|
||
mov dx,GrpIndex ; graphic controller
|
||
mov ax,0205h ; write mode 2
|
||
out dx,ax
|
||
mov dx,cx
|
||
mov ax,si
|
||
xor ch,ch
|
||
ColorClearLoop:
|
||
call HwScrollAdjustDi
|
||
mov cl,dl ; window width
|
||
rep stosb
|
||
add di,bp
|
||
dec bx
|
||
jnz ColorClearLoop
|
||
mov dx,GrpIndex ; graphic controller
|
||
mov ax,0005h ; write mode 0
|
||
out dx,ax
|
||
ret
|
||
|
||
HwScrollAdjustI:
|
||
test cs:[ModeStat],HwScroll
|
||
jz VgaGrpScrollLpDo
|
||
cmp si,80*16*26
|
||
jbe @f
|
||
add si,80*16*25
|
||
@@:
|
||
cmp si,80*16*25
|
||
jb HwScrollAdjustDi
|
||
sub si,80*16*25
|
||
HwScrollAdjustDi:
|
||
test cs:[ModeStat],HwScroll
|
||
jz VgaGrpScrollLpDo
|
||
cmp di,80*16*26
|
||
jbe @f
|
||
add di,80*16*25
|
||
@@:
|
||
cmp di,80*16*25
|
||
jb VgaGrpScrollLpDo
|
||
sub di,80*16*25
|
||
VgaGrpScrollLpDo:
|
||
ret
|
||
|
||
HwScrollAdjust:
|
||
push ax
|
||
test cs:[ModeStat],HwScroll
|
||
jz HwScrollAdjustEnd
|
||
call GetCrtStartAddr
|
||
add si,ax
|
||
cmp si,80*16*25
|
||
jb @f
|
||
sub si,80*16*25
|
||
@@:
|
||
add di,ax
|
||
cmp di,80*16*25
|
||
jb HwScrollAdjustEnd
|
||
sub di,80*16*25
|
||
HwScrollAdjustEnd:
|
||
pop ax
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
; << VgaWritePixel >>
|
||
; FUNCTION = write pixel
|
||
; INPUT : AL,CX,DX
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
; VgaWritePixel(AL,CX,DX/-)
|
||
VgaWritePixel:
|
||
mov bl,al
|
||
call CalcPixelColor
|
||
WriteDotColorDo:
|
||
cli
|
||
mov dx,GrpIndex
|
||
or bl,bl
|
||
jns @f ; jump if MSB = 0
|
||
mov ax,1803h
|
||
out dx,ax
|
||
@@:
|
||
xor al,al
|
||
mov ah,bl
|
||
out dx,ax
|
||
mov ax,0ff01h
|
||
out dx,ax
|
||
mov al,8
|
||
mov ah,ch
|
||
out dx,ax
|
||
mov ah,es:[di]
|
||
stosb
|
||
mov ah,-1
|
||
out dx,ax
|
||
mov ax,3
|
||
out dx,ax
|
||
xor ax,ax
|
||
out dx,ax
|
||
inc ax
|
||
out dx,ax
|
||
sti
|
||
ret
|
||
CalcPixelColor:
|
||
mov ax,80
|
||
mul dx
|
||
mov dx,cx
|
||
shr cx,1
|
||
shr cx,1
|
||
shr cx,1
|
||
add ax,cx
|
||
and dl,7
|
||
mov cx,dx
|
||
mov ch,10000000b
|
||
shr ch,cl
|
||
les di,[GrpBufAddr]
|
||
add di,ax
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
; << VgaReadPixel >>
|
||
; FUNCTION = read pixel
|
||
; INPUT : BH,CX,DX
|
||
; OUTPUT : al = color
|
||
; PROTECT : none
|
||
; VgaReadPixel(BH,CX,DX/-)
|
||
;
|
||
VgaReadPixel:
|
||
call CalcPixelColor
|
||
ReadDotColorDo:
|
||
cli
|
||
mov al,7
|
||
sub al,cl
|
||
mov cl,al
|
||
mov dx,GrpIndex
|
||
mov ax,4
|
||
out dx,ax
|
||
mov bl,es:[di]
|
||
and bl,ch
|
||
shr bl,cl
|
||
mov bh,bl
|
||
inc ah
|
||
out dx,ax
|
||
mov bl,es:[di]
|
||
and bl,ch
|
||
shr bl,cl
|
||
shl bl,1
|
||
or bh,bl
|
||
inc ah
|
||
out dx,ax
|
||
mov bl,es:[di]
|
||
and bl,ch
|
||
shr bl,cl
|
||
shl bl,1
|
||
shl bl,1
|
||
or bh,bl
|
||
inc ah
|
||
out dx,ax
|
||
mov bl,es:[di]
|
||
and bl,ch
|
||
shr bl,cl
|
||
shl bl,1
|
||
shl bl,1
|
||
shl bl,1
|
||
xor ah,ah
|
||
out dx,ax
|
||
mov al,bl
|
||
or al,bh
|
||
sti
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
; << VgaGrpBlock >>
|
||
; FUNCTION = Color Graphic Screen Block Move/Copy
|
||
; INPUT : DI = Target ( BX )
|
||
; SI = Source ( CX )
|
||
; DL = Window weidth ( X )
|
||
; DH = Window height ( Y )
|
||
; BP = Screen width - Window width ( X' )
|
||
; BH:BL = Move/Copy : Attr
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
; VgaGrpBlock(bx,dx,bp/-)
|
||
|
||
VgaGrpBlock :
|
||
pop bx
|
||
mov es,dx
|
||
pop di
|
||
mov ax,di
|
||
mov al,ah
|
||
xor ah,ah
|
||
mov dx,80*16
|
||
mul dx
|
||
and di,0ffh
|
||
add di,ax
|
||
pop si
|
||
mov ax,si
|
||
mov al,ah
|
||
xor ah,ah
|
||
mov dx,80*16
|
||
mul dx
|
||
and si,0ffh
|
||
add si,ax ; DI
|
||
sar bp,1 ; make byte length
|
||
test bh,40h ; jump if positive value
|
||
jnz @f
|
||
add di,80*15
|
||
add si,80*15
|
||
@@:
|
||
call HwScrollAdjust
|
||
lds ax,[GrpBufAddr]
|
||
mov dx,GrpIndex
|
||
mov ax,105h
|
||
out dx,ax
|
||
mov dx,es
|
||
mov al,dh
|
||
mov dh,16
|
||
mul dh ; AX = y
|
||
mov cs:[BlockAdj],ax
|
||
mov dx,es
|
||
mov ax,ds
|
||
mov es,ax
|
||
xchg bl,bh
|
||
mov al,bh
|
||
cmp cs:[ModeId],2*3 ; EGA/VGA mode 7
|
||
jnz @f
|
||
mov al,0
|
||
test bh,01110111B
|
||
jz @f
|
||
mov al,1
|
||
test bh,01111000B
|
||
jz @f
|
||
mov al,bh
|
||
and al,01111000B
|
||
cmp al,00001000B
|
||
mov al,4
|
||
jz @f
|
||
mov al,10h
|
||
test bh,00000111B
|
||
jz @f
|
||
mov al,11h
|
||
test bh,00001000B
|
||
jz @f
|
||
mov al,40h
|
||
@@:
|
||
shr al,1
|
||
shr al,1
|
||
shr al,1
|
||
shr al,1
|
||
xchg ax,bx
|
||
mov bh,al
|
||
xor ch,ch
|
||
@@:
|
||
call HwScrollAdjustI
|
||
mov cl,dl
|
||
test bh,1
|
||
jz BlockGrpMove2
|
||
rep movsb
|
||
jmp short BlockGrpMove2End
|
||
BlockGrpMove2:
|
||
push dx
|
||
mov dx,GrpIndex
|
||
BlockGrpMove2Lp:
|
||
mov al,[si]
|
||
stosb
|
||
mov ax,205h
|
||
out dx,ax
|
||
xchg si,di
|
||
mov al,bl
|
||
stosb
|
||
xchg si,di
|
||
mov ax,105h
|
||
out dx,ax
|
||
loop BlockGrpMove2Lp
|
||
pop dx
|
||
BlockGrpMove2End:
|
||
add di,bp
|
||
add si,bp
|
||
dec cs:[BlockAdj]
|
||
jnz @b
|
||
mov dx,GrpIndex
|
||
mov ax,5 ; write mode 0
|
||
out dx,ax
|
||
mov ax,cs
|
||
mov ds,ax
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
; << FullScrollColor >>
|
||
;
|
||
; FUNCTION = color buffer full scroll
|
||
; INPUT : ES:DI = graphics buffer, BL = attribute
|
||
; OUTPUT : none
|
||
; PROTECT : none
|
||
;
|
||
; FullScrollColor(ES,DI,BL/-)
|
||
;
|
||
FullScrollColor:
|
||
mov dx,GrpIndex ; get addr of grp ctrl index register
|
||
test cs:[ModeStat],HwScroll
|
||
jnz HwFullScrollDo
|
||
mov ax,es
|
||
mov ds,ax
|
||
mov si,di
|
||
add si,80*16
|
||
mov ax,105h
|
||
out dx,ax
|
||
mov cx,24*16*80
|
||
cmp cs:[MaxRows],25
|
||
jbe @f
|
||
mov cx,29*16*80
|
||
@@:
|
||
rep movsb
|
||
FullScrollFill:
|
||
mov ax,205h
|
||
out dx,ax
|
||
mov cx,16*80
|
||
xor al,al
|
||
test cs:[ModeStat],GrpMode
|
||
jnz @f
|
||
mov al,bl
|
||
shr al,1
|
||
shr al,1
|
||
shr al,1
|
||
shr al,1
|
||
@@:
|
||
rep stosb
|
||
mov ax,5
|
||
out dx,ax
|
||
ret
|
||
HwFullScrollDo:
|
||
call GetCrtStartAddr
|
||
mov di,ax
|
||
add ax,80*16
|
||
cmp ax,80*16*25
|
||
jb @f
|
||
xor ax,ax
|
||
@@:
|
||
call HwFullScroll
|
||
mov dl,(GrpIndex AND 0ffh)
|
||
jmp short FullScrollFill
|
||
HwFullScroll:
|
||
mov dx,3dah
|
||
mov cx,ax
|
||
cli
|
||
@@:
|
||
in al,dx
|
||
test al,8
|
||
jnz @b
|
||
@@:
|
||
in al,dx
|
||
test al,8
|
||
jz @b
|
||
mov ax,cx
|
||
or ax,ax
|
||
jz HwFullScroll2
|
||
mov dl,0d4h
|
||
mov al,0ch
|
||
out dx,ax
|
||
mov ax,cx
|
||
xor dx,dx
|
||
mov cx,80
|
||
div cx
|
||
mov cx,16*25-1
|
||
sub cx,ax
|
||
mov dx,3d4h
|
||
mov ah,cl
|
||
mov al,18h
|
||
out dx,ax ; set scan lines - bit 0-7
|
||
mov ax,1f07h
|
||
test ch,00000001b
|
||
jnz @f
|
||
mov ah,0fh
|
||
@@:
|
||
out dx,ax ; set scan lines - bit 8
|
||
mov ax,9
|
||
out dx,ax ; set scan lines - bit 9
|
||
sti
|
||
ret
|
||
HwFullScroll2:
|
||
mov dl,0d4h
|
||
mov ax,0ch
|
||
out dx,ax
|
||
mov dl,0dah
|
||
@@:
|
||
in al,dx
|
||
test al,8
|
||
jnz @b
|
||
@@:
|
||
in al,dx
|
||
test al,8
|
||
jz @b
|
||
mov dl,0d4h
|
||
mov ax,9
|
||
out dx,ax ; set scan lines - bit 9
|
||
mov ax,1f07h
|
||
out dx,ax ; set scan lines - bit 8
|
||
mov ax,8f18h
|
||
out dx,ax ; set scan lines - bit 0 - 7
|
||
sti
|
||
ret
|
||
GetCrtStartAddr:
|
||
pushf
|
||
cli
|
||
push dx
|
||
push bx
|
||
mov dx,3d4h
|
||
in al,dx
|
||
mov bl,al
|
||
mov al,0ch
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
mov ah,al
|
||
xor al,al
|
||
xchg bx,ax
|
||
dec dx
|
||
out dx,al
|
||
xchg bx,ax
|
||
pop bx
|
||
pop dx
|
||
popf
|
||
ret
|
||
|
||
;------------------------------------------------------------------------
|
||
; << ToggleColorCursor >>
|
||
; FUNCTION = color cursor toggle
|
||
; INPUT : none
|
||
; OUTPUT : none
|
||
; PROTECT : DS,SI
|
||
; ToggleColorCursor(-/-)
|
||
|
||
ToggleColorCursor:
|
||
mov cx,[rCurType] ; BIOS Cursor Type Information Read
|
||
test [rInfo],00000001b
|
||
jnz @f
|
||
cmp [ModeId],3*2 ; 3 - text emulation mode 7, EGA/VGA
|
||
jz @f
|
||
shl cx,1 ; Cursor Mode * 2 ( COLOR )
|
||
add cx,201h
|
||
@@:
|
||
cmp ch,20h ; Check Not Display Cursor Type
|
||
jb @f
|
||
ret
|
||
@@:
|
||
and cx,0f0fh ; Get Low 4 Bits
|
||
sub cl,ch
|
||
jnc @f
|
||
ret
|
||
@@:
|
||
cli
|
||
inc cl
|
||
mov ax,[OrgCurType]
|
||
mov dx,[OrgCurPos]
|
||
test [CursorStat],CursorOn
|
||
jnz @f
|
||
mov bl,[CurPage]
|
||
xor bh,bh
|
||
shl bx,1
|
||
mov dx,[bx+rCurPos]
|
||
mov [OrgCurPos],dx
|
||
mov ax,cx
|
||
@@:
|
||
cmp dl,80
|
||
jae ToggleColorCursorExit
|
||
cmp dh,[MaxRows]
|
||
jae ToggleColorCursorExit
|
||
mov [OrgCurType],ax
|
||
mov cx,ax
|
||
les di,[GrpBufAddr]
|
||
mov ax,80
|
||
mul dh
|
||
shl ax,1
|
||
shl ax,1
|
||
shl ax,1
|
||
shl ax,1
|
||
xor dh,dh
|
||
add di,dx
|
||
add di,ax ; 80 * 16 * Rows +Cols
|
||
mov ax,80
|
||
mul ch ; Row * 80
|
||
add di,ax
|
||
test cs:[ModeStat],HwScroll
|
||
jz @f
|
||
call GetCrtStartAddr
|
||
add di,ax
|
||
cmp di,80*16*25
|
||
jb @f
|
||
sub di,80*16*25
|
||
@@:
|
||
mov dx,SeqIndex ; EGA/VGA Sequence Register
|
||
mov ax,702h ; Color Plan Write Enable Register
|
||
out dx,ax ; Enable Plan 0,1,2
|
||
mov dx,GrpIndex ; EGA/VGA Graphic Controller
|
||
mov ax,1803h ; Write Data XOR & None Rotation
|
||
out dx,ax
|
||
mov al,0FFh ; Mask Patten Value
|
||
xor ch,ch ; Clear CH
|
||
@@:
|
||
mov ah,es:[di] ; Latched Data Load
|
||
mov es:[di],al ; XOR & Mask
|
||
add di,80
|
||
loop @b ; CX = Counter Value = Low - High
|
||
mov ax,3 ; Write Data Unmodified & None Rotation
|
||
out dx,ax
|
||
mov ax,0F02h ; All Plan Enable
|
||
mov dx,SeqIndex ; EGA/VGA Sequence Register
|
||
out dx,ax
|
||
xor [CursorStat],CursorOn
|
||
ToggleColorCursorExit:
|
||
sti
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
public HanSavePtr, VideoParmsTbl, Mode2E, Mode3E, Mode23, Mode7, Mode07
|
||
public Mode3V, Mode07V, Mode3Ega, Mode7Ega
|
||
|
||
VideoParmsTbl label byte
|
||
db 64*2 dup(?) ; 0, 1
|
||
Mode2 db 64 dup(?) ; 2
|
||
Mode3 db 64*4 dup(?) ; 3, 4, 5, 6
|
||
Mode7 db 64 dup(?) ; 7
|
||
Mode60 label byte ; 8
|
||
db 80,24,16,0,080h ,1,0Fh,0,6 ,063h ; gen, seq, misc
|
||
db 5Fh,4Fh,50h,82h,54h,80h,0BFh,1Fh,0,40h,0,0,0,0,0,0 ; crtc
|
||
db 9Ch,0Eh,8Fh,28h,0FH,96h,0B9h,0E3h,0FFh ; crtc
|
||
db 0,1,2,3,4,5,14h,7,38h,39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh ; attr
|
||
db 1,0,0Fh,0 ; attr
|
||
db 0,0,0,0,0,0,5,0Fh,0FFh ; grp
|
||
Mode40 label byte ; 9
|
||
db 80,24,16,0,80h ,1,1,0,6 ,063h
|
||
db 5Fh,4Fh,50h,82h,54h,80h,0BFh,1Fh,0,43h,2EH,0FH,0,0,0,0
|
||
db 9Ch,0Eh,8Fh,28h,0FH,96h,0B9h,0C0h,0FFh
|
||
db 0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 ; normal white
|
||
db 1,0,1,0
|
||
db 0,0,0,0,0,0,0Dh,0,0FFh
|
||
Mode70 label byte ; 10
|
||
db 80,24,16,0,80h ,1,1,0,6 ,062h
|
||
db 5Fh,4Fh,50h,82h,54h,80h,0BFh,1Fh,0,43h,2EH,0FH,0,0,0,0
|
||
db 9Ch,0Eh,8Fh,28h,0FH,96h,0B9h,0C0h,0FFh
|
||
db 0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 ; normal white
|
||
db 1,0,1,0
|
||
db 0,0,0,0,0,0,09h,0,0FFh
|
||
db 64*6 dup(?) ; 11, 12, 13, 14, 15, 16
|
||
ModeFGt64 db 64 dup(?) ; 17
|
||
Mode10Gt64 db 64*3 dup(?) ; 18, 19, 20
|
||
Mode2E db 64 dup(?) ; 21
|
||
Mode3E db 64 dup(?) ; 22 (EGA)
|
||
Mode01 label byte ; 23
|
||
Mode60E label byte ; 23
|
||
db 80,24,16,0,080h ,1,0Fh,0,6 ,0A7h
|
||
db 5Bh,4Fh,53h,37h,52h,00h,09Fh,1Fh,0,0,0DH,0EH,0,0,0,0 ; crtc
|
||
db 90h,2Bh,8Fh,28h,0FH,95h,1Dh,0E3h,0FFh ; crtc
|
||
db 0,1,2,3,4,5,14h,7,38h,39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh ; attr
|
||
db 1,0,0Fh,0
|
||
db 0,0,0,0,0,0,5,0Fh,0FFh
|
||
Mode23 label byte ; 24
|
||
Mode40E label byte ; 24
|
||
db 80,24,16,0,80h ,1,1,0,6 ,0A7h
|
||
db 5Bh,4Fh,53h,37h,52h,00h,09Fh,1Fh,0,3,2EH,0FH,0,0,0,0 ; crtc
|
||
db 90h,2Bh,8Fh,28h,0FH,95h,1Dh,0C0h,0FFh ; crtc
|
||
db 0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 ; normal white
|
||
db 1,0,1,0
|
||
db 0,0,0,0,0,0,0Dh,0,0FFh
|
||
Mode07 label byte ; 25
|
||
Mode70E label byte ; 25
|
||
db 80,24,16,0,80h ,1,1,0,6 ,0A6h
|
||
db 5Bh,4Fh,53h,37h,52h,00h,09Fh,1Fh,0,3,2EH,0FH,0,0,0,0 ; crtc
|
||
db 90h,2Bh,8Fh,28h,0FH,95h,1Dh,0C0h,0FFh ; crtc
|
||
db 0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 ; normal white
|
||
db 1,0,1,0
|
||
db 0,0,0,0,0,0,09h,0,0FFh
|
||
Mode11 db 64 dup(?) ; 26
|
||
Mode12 db 64*2 dup(?) ; 27, 28
|
||
|
||
; graphics VGA mode 2, 3, 7
|
||
Mode3V label byte ; 29
|
||
db 80,24,16,0,010h ,1,0Fh,0,6 ,063h ; gen, seq, misc
|
||
db 5Fh,4Fh,50h,82h,54h,80h,0BFh,1Fh,0,40h,0DH,0EH,0,0,0,0; crtc
|
||
db 9Ch,0Eh,8Fh,28h,0FH,96h,0B9h,0E3h,0FFh ; crtc
|
||
db 0,1,2,3,4,5,14h,7,38h,39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh ; attr
|
||
db 1,0,0Fh,0 ; attr
|
||
db 0,0,0,0,0,0,1,0Fh,0FFh ; grp
|
||
Mode07V label byte ; 30
|
||
db 80,24,16,0,10h ,1,0Fh,0,6 ,062h
|
||
db 5Fh,4Fh,50h,82h,54h,80h,0BFh,1Fh,0,40h,0DH,0EH,80H,0,0,0
|
||
db 9Ch,0Eh,8Fh,28h,0FH,96h,0B9h,0E3h,0FFh
|
||
db 0,8,0,0,18h,18h,0,0,0,8,0,0,0,8,0,0
|
||
db 03H,0,05H,0
|
||
db 0,0,0,0,0,0,01h,05H,0FFh
|
||
; graphics EGA mode 2, 3, 7
|
||
Mode3Ega label byte ; 31
|
||
db 80,24,16,0,010h ,1,0Fh,0,6 ,0A7h
|
||
db 5Bh,4Fh,53h,37h,52h,00h,09Fh,1Fh,0,0,0DH,0EH,0,0,0,0 ; crtc
|
||
db 90h,2Bh,8Fh,28h,0FH,95h,1Dh,0E3h,0FFh ; crtc
|
||
db 0,1,2,3,4,5,14h,7,38h,39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh ; attr
|
||
db 1,0,0Fh,0
|
||
db 0,0,0,0,0,0,1,0Fh,0FFh
|
||
Mode7Ega label byte ; 32
|
||
db 80,24,16,0,10h ,1,0FH,0,6 ,0A6h
|
||
db 5Bh,4Fh,53h,37h,52h,00h,09Fh,1Fh,0,0,0DH,0EH,0,80h,0,0; crtc
|
||
db 90h,2Bh,8Fh,28h,0FH,95h,1Dh,0E3h,0FFh ; crtc
|
||
db 0,8,0,0,18h,18h,0,0,0,8,0,0,0,8,0,0
|
||
db 03H,0,05H,0
|
||
db 0,0,0,0,0,0,01h,05H,0FFh
|
||
;------------------------------------------------------------------------
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
public HanOnEga, HanOffEga, GetFontEga, PutFontEga
|
||
HanOnEga:
|
||
HanOffEga:
|
||
GetFontEga:
|
||
PutFontEga:
|
||
stc
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------
|
||
if AtiVga
|
||
public AtiHanOnVga, AtiHanOffVga, AtiGetFontVga, AtiPutFontVga
|
||
AtiHanOnVga:
|
||
mov dx,3ddh
|
||
mov ax,101h
|
||
out dx,ax
|
||
mov dx,1ceh
|
||
mov al,0bfh
|
||
mov ah,al
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
or al,00100000b
|
||
dec dx
|
||
xchg al,ah
|
||
out dx,ax
|
||
ret
|
||
AtiHanOffVga:
|
||
mov dx,3ddh
|
||
mov ax,1
|
||
out dx,ax
|
||
mov dx,1ceh
|
||
mov al,0bfh
|
||
mov ah,al
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,11011111b
|
||
dec dx
|
||
xchg al,ah
|
||
out dx,ax
|
||
ret
|
||
AtiGetFontVga:
|
||
mov dx,es
|
||
mov ds,dx
|
||
mov dx,3ddh
|
||
mov ah,ch
|
||
mov al,10h
|
||
cli
|
||
out dx,ax
|
||
mov ah,cl
|
||
mov al,8
|
||
out dx,ax
|
||
mov ax,201h
|
||
mov cl,4
|
||
cmp ch,0feh ; assume FExx
|
||
jnz @f
|
||
mov ah,6 ; set C9xx
|
||
mov cl,2
|
||
@@:
|
||
cmp ch,0c9h
|
||
jnz @f
|
||
mov cl,2
|
||
@@:
|
||
out dx,ax
|
||
mov al,cl
|
||
out dx,al
|
||
inc dx
|
||
mov bx,di
|
||
mov cx,16
|
||
@@:
|
||
in al,dx
|
||
stosb
|
||
inc di
|
||
loop @b
|
||
mov di,bx
|
||
mov cl,16
|
||
@@:
|
||
inc di
|
||
in al,dx
|
||
stosb
|
||
loop @b
|
||
dec dx
|
||
mov ax,1
|
||
out dx,ax
|
||
sti
|
||
clc
|
||
ret
|
||
AtiPutFontVga:
|
||
mov dx,3ddh
|
||
mov ah,cl
|
||
mov al,8
|
||
cli
|
||
out dx,ax
|
||
mov ax,201h
|
||
cmp ch,0feh ; assume FExx
|
||
jnz @f
|
||
mov ah,6 ; set C9xx
|
||
@@:
|
||
out dx,ax
|
||
mov al,2
|
||
out dx,al
|
||
inc dx
|
||
mov bx,si
|
||
mov cx,16
|
||
@@:
|
||
lodsw
|
||
out dx,al
|
||
loop @b
|
||
mov si,bx
|
||
mov cl,16
|
||
@@:
|
||
lodsw
|
||
mov al,ah
|
||
out dx,al
|
||
loop @b
|
||
dec dx
|
||
mov ax,1
|
||
out dx,ax
|
||
sti
|
||
clc
|
||
ret
|
||
endif ; AtiVga
|
||
|
||
;------------------------------------------------------------------------
|
||
if KseVga
|
||
public KseHanOnVga, KseHanOffVga, KseGetFontVga, KsePutFontVga
|
||
KseHanOnVga:
|
||
call KseVgaKey
|
||
mov ax,0832h
|
||
out dx,ax
|
||
mov al,34h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,11111101b
|
||
out dx,al ; set 8 bit bus
|
||
dec dx
|
||
mov al,35h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,01111111b
|
||
out dx,al ; set 8 bit bus
|
||
dec dx
|
||
mov al,36h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,10110111b
|
||
out dx,al ; set 8 bit bus
|
||
dec dx
|
||
mov al,37h
|
||
out dx,al
|
||
inc dl
|
||
in al,dx
|
||
and al,11111110b
|
||
or al,00000010b
|
||
out dx,al
|
||
mov dl,0c4h
|
||
mov al,1
|
||
out dx,al
|
||
inc dl
|
||
in al,dx
|
||
or al,1
|
||
out dx,al
|
||
mov dx,258h
|
||
mov ax,0e8f0h ; enable hangeul
|
||
out dx,ax
|
||
mov al,0f4h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
or al,10000000b
|
||
and al,11111011b
|
||
out dx,al ; set english
|
||
dec dl
|
||
mov ax,0fff5h
|
||
out dx,ax
|
||
push dx
|
||
mov ah,3
|
||
mov bh,cs:[CurPage]
|
||
pushf
|
||
call cs:[OldVideo]
|
||
mov ah,1
|
||
pushf
|
||
call cs:[OldVideo]
|
||
call KseVEop
|
||
pop dx
|
||
ret
|
||
KseHanOffVga:
|
||
call KseVgaKey
|
||
mov ax,832h
|
||
out dx,ax
|
||
mov al,34h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,11111101b
|
||
or al,00001000b
|
||
out dx,al
|
||
dec dx
|
||
mov al,35h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,01111111b
|
||
out dx,al ; set 8 bit bus
|
||
dec dx
|
||
mov al,36h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,11110111b
|
||
out dx,al ; set 8 bit bus
|
||
dec dx
|
||
mov al,37h
|
||
out dx,al
|
||
inc dl
|
||
in al,dx
|
||
and al,11111110b
|
||
or al,00000010b
|
||
out dx,al
|
||
mov dx,258h
|
||
mov ax,0f0h
|
||
mov ah,20
|
||
out dx,ax ; set english
|
||
mov al,0f4h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,01110111b
|
||
or al,00001000b
|
||
out dx,al ; set english
|
||
; border color off
|
||
mov dx,257h
|
||
in al,dx
|
||
mov al,2 ;index 2
|
||
out dx,al
|
||
mov al,0
|
||
out dx,al
|
||
ret
|
||
KseVgaKey:
|
||
mov dx,3bfh
|
||
mov al,3
|
||
out dx,al
|
||
mov dx,3cch
|
||
in al,dx
|
||
mov dl,0d4h
|
||
test al,1
|
||
jnz @f
|
||
mov dl,0b4h
|
||
@@:
|
||
add dl,4
|
||
mov al,0a0h
|
||
out dx,al
|
||
sub dl,4
|
||
mov al,11h
|
||
out dx,al
|
||
inc dl
|
||
in al,dx
|
||
and al,not 80h
|
||
out dx,al
|
||
dec dl
|
||
ret
|
||
KseVEop:
|
||
mov bx,ax
|
||
call KseVgaKey
|
||
mov dx,3cch
|
||
in al,dx
|
||
mov dl,0d4h
|
||
test al,1
|
||
jnz @f
|
||
mov dl,0b4h
|
||
@@:
|
||
mov al,-1
|
||
out dx,al ; dumy for mode 7
|
||
mov dl,0bfh
|
||
mov al,cs:[Port3bf]
|
||
out dx,al
|
||
mov ax,bx
|
||
ret
|
||
KseGetFontVga:
|
||
mov bx,ax
|
||
mov dx,258h
|
||
mov al,0f4h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,11110111b
|
||
out dx,al
|
||
dec dx
|
||
mov al,0f0h ; access enable
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,11111110b
|
||
or al,00000010b
|
||
out dx,al
|
||
mov si,255h
|
||
shl cl,1
|
||
shr cx,1
|
||
mov ax,32
|
||
mul cx
|
||
mov cx,dx
|
||
mov dx,250h
|
||
mov bl,al
|
||
out dx,al
|
||
inc dx
|
||
mov al,ah
|
||
out dx,al
|
||
inc dx
|
||
mov al,cl
|
||
out dx,al
|
||
mov cx,32
|
||
@@:
|
||
mov dx,si
|
||
in al,dx
|
||
stosb
|
||
mov dl,50h
|
||
inc bl
|
||
mov al,bl
|
||
out dx,al
|
||
loop @b
|
||
KseVGetEnd:
|
||
mov dl,58h
|
||
mov al,0f0h
|
||
out dx,al
|
||
inc dl
|
||
in al,dx
|
||
and al,11111100b
|
||
out dx,al
|
||
clc
|
||
ret
|
||
KsePutFontVga:
|
||
mov dx,258h ;**ket bit
|
||
mov al,0f4h
|
||
out dx,al ;read-inx
|
||
inc dx
|
||
in al,dx
|
||
and al,11110111b
|
||
out dx,al
|
||
dec dx ;.**
|
||
mov al,0f0h ;**access enable
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
or al,00000011b
|
||
out dx,al
|
||
mov di,255h
|
||
shl cl,1
|
||
shr cx,1
|
||
mov ax,32
|
||
mul cx
|
||
mov cx,dx
|
||
mov dx,250h
|
||
mov bl,al
|
||
out dx,al
|
||
inc dx
|
||
mov al,ah
|
||
out dx,al
|
||
inc dx
|
||
mov al,cl
|
||
out dx,al
|
||
mov cx,32
|
||
@@:
|
||
mov dl,58h
|
||
mov al,0f0h
|
||
out dx,al
|
||
inc dx
|
||
in al,dx
|
||
and al,11111110b
|
||
or al,00000010b
|
||
out dx,al
|
||
mov dl,53h
|
||
in al,dx
|
||
out dx,al
|
||
inc dl
|
||
in al,dx
|
||
out dx,al
|
||
inc dl
|
||
in al,dx
|
||
out dx,al
|
||
mov dl,58h
|
||
mov al,0f0h
|
||
out dx,al ;read-inx
|
||
inc dx
|
||
in al,dx
|
||
or al,00000011b
|
||
out dx,al
|
||
mov dx,di
|
||
lodsb
|
||
out dx,al
|
||
mov dl,56h
|
||
out dx,al
|
||
mov dl,50h
|
||
inc bl
|
||
mov al,bl
|
||
out dx,al
|
||
loop @b
|
||
jmp KseVGetEnd
|
||
endif ; if KseVga
|
||
|