|
|
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
|