reactos/rosapps/sysutils/utils/pice/module/vga_utils.asm

730 lines
20 KiB
NASM

;/*++
;
;Copyright (c) 1998-2001 Klaus P. Gerlicher
;
;Module Name:
;
; vga_utils.asm
;
;Abstract:
;
; assembler function for directly programming standard VGA
;
;Environment:
;
; LINUX 2.2.X
; Kernel mode only
;
;Author:
;
; Klaus P. Gerlicher
; Reactos Port by Eugene Ingerman
;
;Revision History:
;
; 30-Oct-2001: created
;
;Copyright notice:
;
; This file may be distributed under the terms of the GNU Public License.
;
;--*/
global _pice_save_current_registers
global _pice_restore_current_registers
global _pice_set_mode_3_80x50
global _pice_set_mode_3_80x25
;****************************************************************************
;* some assign's ************************************************************
;****************************************************************************
%assign VGA_CRT_REGISTERS 24
%assign VGA_ATTRIBUTE_REGISTERS 21
%assign VGA_GRAPHIC_REGISTERS 9
%assign VGA_SEQUENCER_REGISTERS 5
%assign VGA_MISC_REGISTERS 1
%assign VGA_IO_BASE 03c0h
%assign VGA_IO_SIZE 020h
%assign VGA_ATTRIBUTE_INDEX 03c0h
%assign VGA_ATTRIBUTE_DATA_WRITE 03c0h
%assign VGA_ATTRIBUTE_DATA_READ 03c1h
%assign VGA_MISC_DATA_WRITE 03c2h
%assign VGA_SEQUENCER_INDEX 03c4h
%assign VGA_SEQUENCER_DATA 03c5h
%assign VGA_PEL_MASK 03c6h
%assign VGA_PEL_INDEX_READ 03c7h
%assign VGA_PEL_INDEX_WRITE 03c8h
%assign VGA_PEL_DATA 03c9h
%assign VGA_MISC_DATA_READ 03cch
%assign VGA_GRAPHIC_INDEX 03ceh
%assign VGA_GRAPHIC_DATA 03cfh
%assign VGA_CRT_INDEX 03d4h
%assign VGA_CRT_DATA 03d5h
%assign VGA_INPUT_STATUS 03dah
section .data
pice_mode3_80x50_registers:
; offsets 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18
.crt: db 0x5f,0x4f,0x50,0x82,0x55,0x80,0xbf,0x1f,0x00,0x67,0x06,0x07,0x00,0x00,0x00,0x00,0x9c,0x8f,0x8f,0x28,0x1f,0x96,0xb9,0xa3,0xff
.attribute db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0f,0x00,0x00
.graphic: db 0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,0xff
.sequencer: db 0x03,0x00,0x03,0x00,0x02 ; 9 bits per char
;.sequencer: db 0x03,0x01,0x03,0x00,0x02 ; 8 bits per char
.misc: db 0x67
pice_mode3_80x25_registers:
; offsets 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18
.crt: db 0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,0x00,0x4f,0x0d,0x0e,0x00,0x00,0x30,0xe8,0x9c,0x0e,0x8f,0x28,0x1f,0x96,0xb9,0xa3
.attribute db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x0c,0x00,0x0f,0x08,0x00
.graphic: db 0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,0xff
.sequencer: db 0x03,0x00,0x03,0x00,0x02
.misc: db 0x67
section .bss
pice_current_registers:
.crt: resb VGA_CRT_REGISTERS
.attribute: resb VGA_ATTRIBUTE_REGISTERS
.graphic: resb VGA_GRAPHIC_REGISTERS
.sequencer: resb VGA_SEQUENCER_REGISTERS
.misc: resb VGA_MISC_REGISTERS
align 4
.colormap: resd 256
;****************************************************************************
;* pice_save_current_charset ************************************************
;****************************************************************************
section .text
pice_address dd 0xc00a0000
pice_save_current_charset:
xor dword ebx, ebx
call pice_select_read_plane
mov dword ecx, 04000h
mov dword esi, [pice_address]
mov dword edi, pice_charset_saved
cld
rep movsd
mov dword ebx, 00100h
call pice_select_read_plane
mov dword ecx, 04000h
mov dword esi, [pice_address]
mov dword edi, (pice_charset_saved + 010000h)
cld
rep movsd
mov dword ebx, 00200h
call pice_select_read_plane
mov dword ecx, 04000h
mov dword esi, [pice_address]
mov dword edi, (pice_charset_saved + 020000h)
cld
rep movsd
mov dword ebx, 00300h
call pice_select_read_plane
mov dword ecx, 04000h
mov dword esi, [pice_address]
mov dword edi, (pice_charset_saved + 030000h)
cld
rep movsd
.end: ret
;****************************************************************************
;* pice_restore_current_charset ****************************************************
;****************************************************************************
section .text
pice_restore_current_charset:
mov dword ebx, 00100h
call pice_select_write_plane
mov dword ecx, 04000h
mov dword esi, pice_charset_saved
mov dword edi, [pice_address]
cld
rep movsd
mov dword ebx, 00200h
call pice_select_write_plane
mov dword ecx, 04000h
mov dword esi, (pice_charset_saved + 010000h)
mov dword edi, [pice_address]
cld
rep movsd
mov dword ebx, 00400h
call pice_select_write_plane
mov dword ecx, 04000h
mov dword esi, (pice_charset_saved + 020000h)
mov dword edi, [pice_address]
cld
rep movsd
mov dword ebx, 00800h
call pice_select_write_plane
mov dword ecx, 04000h
mov dword esi, (pice_charset_saved + 030000h)
mov dword edi, [pice_address]
cld
rep movsd
.end: ret
;****************************************************************************
;* pice_get_crt_registers **************************************************
;****************************************************************************
;* ebx=> pointer where to store crt registers
;****************************************************************************
section .text
pice_get_crt_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_CRT_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_CRT_DATA
in byte al, dx
mov byte [ebx + ecx], al
inc dword ecx
cmp dword ecx, VGA_CRT_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_get_attribute_registers ********************************************
;****************************************************************************
;* ebx=> pointer where to store attribute registers
;****************************************************************************
section .text
pice_get_attribute_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_INPUT_STATUS
in byte al, dx
mov dword edx, VGA_ATTRIBUTE_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_ATTRIBUTE_DATA_READ
in byte al, dx
mov byte [ebx + ecx], al
inc dword ecx
cmp dword ecx, VGA_ATTRIBUTE_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_get_graphic_registers **********************************************
;****************************************************************************
;* ebx=> pointer where to store graphics registers
;****************************************************************************
section .text
pice_get_graphic_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
in byte al, dx
mov byte [ebx + ecx], al
inc dword ecx
cmp dword ecx, VGA_GRAPHIC_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_get_sequencer_registers ********************************************
;****************************************************************************
;* ebx=> pointer where to store sequencer registers
;****************************************************************************
section .text
pice_get_sequencer_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_SEQUENCER_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
in byte al, dx
mov byte [ebx + ecx], al
inc dword ecx
cmp dword ecx, VGA_SEQUENCER_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_get_misc_registers *************************************************
;****************************************************************************
;* ebx=> pointer where to store misc register
;****************************************************************************
section .text
pice_get_misc_registers:
mov dword edx, VGA_MISC_DATA_READ
in byte al, dx
mov byte [ebx], al
ret
;****************************************************************************
;* pice_get_colormap *******************************************************
;****************************************************************************
;* ebx=> pointer where to store colormap
;****************************************************************************
section .text
pice_get_colormap:
xor dword ecx, ecx
xor dword eax, eax
mov dword edx, VGA_PEL_INDEX_READ
out word dx, al
mov dword edx, VGA_PEL_DATA
.loop: in byte al, dx
shl dword eax, 8
in byte al, dx
shl dword eax, 8
in byte al, dx
mov dword [ebx + 4 * ecx], eax
inc dword ecx
test byte cl, cl
jnz .loop
ret
;****************************************************************************
;* pice_set_crt_registers **************************************************
;****************************************************************************
;* ebx=> pointer to stored crt registers
;****************************************************************************
section .text
pice_set_crt_registers:
;deprotect CRT registers 0 - 7
mov dword edx, VGA_CRT_INDEX
mov byte al, 011h
out word dx, al
mov dword edx, VGA_CRT_DATA
in byte al, dx
and byte al, 07fh
out word dx, al
;write to the registers
xor dword ecx, ecx
.loop: mov dword edx, VGA_CRT_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_CRT_DATA
mov byte al, [ebx + ecx]
out word dx, al
inc dword ecx
cmp dword ecx, VGA_CRT_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_set_attribute_registers ********************************************
;****************************************************************************
;* ebx=> pointer to stored attibute registers
;****************************************************************************
section .text
pice_set_attribute_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_INPUT_STATUS
in byte al, dx
mov dword edx, VGA_ATTRIBUTE_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_ATTRIBUTE_DATA_WRITE
mov byte al, [ebx + ecx]
out word dx, al
inc dword ecx
cmp dword ecx, VGA_ATTRIBUTE_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_set_graphic_registers **********************************************
;****************************************************************************
;* ebx=> pointer to stored graphic registers
;****************************************************************************
section .text
pice_set_graphic_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
mov byte al, [ebx + ecx]
out word dx, al
inc dword ecx
cmp dword ecx, VGA_GRAPHIC_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_set_sequencer_registers ********************************************
;****************************************************************************
;* ebx=> pointer to stored sequencer registers
;****************************************************************************
section .text
pice_set_sequencer_registers:
;synchronous reset on
mov dword edx, VGA_SEQUENCER_INDEX
xor dword eax, eax
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
inc dword eax
out word dx, al
;write to the registers
mov dword edx, VGA_SEQUENCER_INDEX
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
mov byte al, [ebx + 1]
or byte al, 020h
out word dx, al
mov dword ecx, 2
.loop: mov dword edx, VGA_SEQUENCER_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
mov byte al, [ebx + ecx]
out word dx, al
inc dword ecx
cmp dword ecx, VGA_SEQUENCER_REGISTERS
jb .loop
;synchronous reset off
mov dword edx, VGA_SEQUENCER_INDEX
xor dword eax, eax
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
mov byte al, 3
out word dx, al
ret
;****************************************************************************
;* pice_set_misc_registers *************************************************
;****************************************************************************
;* ebx=> pointer to stored misc register
;****************************************************************************
section .text
pice_set_misc_registers:
mov dword edx, VGA_MISC_DATA_WRITE
mov byte al, [ebx]
out word dx, al
ret
;****************************************************************************
;* pice_set_colormap *******************************************************
;****************************************************************************
;* ebx=> pointer to stored colormap
;****************************************************************************
section .text
pice_set_colormap:
xor dword ecx, ecx
xor dword eax, eax
mov dword edx, VGA_PEL_INDEX_WRITE
out word dx, al
mov dword edx, VGA_PEL_DATA
.loop: mov dword eax, [ebx + 4 * ecx]
rol dword eax, 16
out word dx, al
rol dword eax, 8
out word dx, al
rol dword eax, 8
out word dx, al
inc dword ecx
test byte cl, cl
jnz .loop
ret
;****************************************************************************
;* pice_screen_on **********************************************************
;****************************************************************************
section .text
pice_screen_on:
;turn on the screen
mov dword edx, VGA_SEQUENCER_INDEX
mov byte al, 1
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
in byte al, dx
and byte al, 0dfh
out word dx, al
;enable video output
mov dword edx, VGA_INPUT_STATUS
in byte al, dx
mov dword edx, VGA_ATTRIBUTE_DATA_WRITE
mov byte al, 020h
out word dx, al
ret
;****************************************************************************
;* pice_select_write_plane *************************************************
;****************************************************************************
;* bl==> write mode
;* bh==> write plane
;****************************************************************************
section .text
pice_select_write_plane:
and dword ebx, 00f03h
;enable set/reset = 0
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 1
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
xor dword eax, eax
out word dx, al
;logical operation = none, rotate = 0
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 3
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
xor dword eax, eax
out word dx, al
;select write mode
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 5
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
in byte al, dx
and byte al, 0fch
or byte al, bl
out word dx, al
;bitmask = 0ffh
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 8
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
mov byte al, 0ffh
out word dx, al
;select write plane
mov dword edx, VGA_SEQUENCER_INDEX
mov byte al, 2
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
mov byte al, bh
out word dx, al
ret
;****************************************************************************
;* pice_select_read_plane **************************************************
;****************************************************************************
;* bl==> read mode
;* bh==> read plane
;****************************************************************************
section .text
pice_select_read_plane:
and dword ebx, 00301h
shl byte bl, 3
;select read mode
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 5
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
in byte al, dx
and byte al, 0f7h
or byte al, bl
out word dx, al
;select read plane
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 4
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
mov byte al, bh
out word dx, al
ret
;****************************************************************************
;* pice_save_current_registers **********************************************
;****************************************************************************
section .text
_pice_save_current_registers:
push esi
push edi
push ebx
; call pice_save_current_charset
.crt: mov dword ebx, pice_current_registers.crt
call pice_get_crt_registers
.attribute: mov dword ebx, pice_current_registers.attribute
call pice_get_attribute_registers
.graphic: mov dword ebx, pice_current_registers.graphic
call pice_get_graphic_registers
.sequencer: mov dword ebx, pice_current_registers.sequencer
call pice_get_sequencer_registers
.misc: mov dword ebx, pice_current_registers.misc
call pice_get_misc_registers
.colormap: mov dword ebx, pice_current_registers.colormap
call pice_get_colormap
pop ebx
pop edi
pop esi
.end: ret
;****************************************************************************
;* pice_restore_current_registers *******************************************
;****************************************************************************
section .text
_pice_restore_current_registers:
push esi
push edi
push ebx
; call pice_restore_current_charset
.misc: mov dword ebx, pice_current_registers.misc
call pice_set_misc_registers
.crt: mov dword ebx, pice_current_registers.crt
call pice_set_crt_registers
.attribute: mov dword ebx, pice_current_registers.attribute
call pice_set_attribute_registers
.graphic: mov dword ebx, pice_current_registers.graphic
call pice_set_graphic_registers
.sequencer: mov dword ebx, pice_current_registers.sequencer
call pice_set_sequencer_registers
.screen_on: call pice_screen_on
.colormap: mov dword ebx, pice_current_registers.colormap
call pice_set_colormap
pop ebx
pop edi
pop esi
.end: ret
;****************************************************************************
;* pice_set_mode_3_80x50*****************************************************
;****************************************************************************
section .text
_pice_set_mode_3_80x50:
push esi
push edi
push ebx
.crt: mov dword ebx, pice_mode3_80x50_registers.crt
call pice_set_crt_registers
.attribute: mov dword ebx, pice_mode3_80x50_registers.attribute
call pice_set_attribute_registers
.graphic: mov dword ebx, pice_mode3_80x50_registers.graphic
call pice_set_graphic_registers
.sequencer: mov dword ebx, pice_mode3_80x50_registers.sequencer
call pice_set_sequencer_registers
.misc: mov dword ebx, pice_mode3_80x50_registers.misc
call pice_set_misc_registers
.screen_on: call pice_screen_on
;.colormap: mov dword ebx, pice_current_registers.colormap
; call pice_set_colormap
pop ebx
pop edi
pop esi
.end: ret
;****************************************************************************
;* pice_set_mode_3_80x25*****************************************************
;****************************************************************************
section .text
_pice_set_mode_3_80x25:
push esi
push edi
push ebx
.crt: mov dword ebx, pice_mode3_80x25_registers.crt
call pice_set_crt_registers
.attribute: mov dword ebx, pice_mode3_80x25_registers.attribute
call pice_set_attribute_registers
.graphic: mov dword ebx, pice_mode3_80x25_registers.graphic
call pice_set_graphic_registers
.sequencer: mov dword ebx, pice_mode3_80x25_registers.sequencer
call pice_set_sequencer_registers
.misc: mov dword ebx, pice_mode3_80x25_registers.misc
call pice_set_misc_registers
.screen_on: call pice_screen_on
;.colormap: mov dword ebx, pice_current_registers.colormap
; call pice_set_colormap
pop ebx
pop edi
pop esi
.end: ret
;****************************************************************************
;* uninitialized data *******************************************************
;****************************************************************************
section .bss
alignb 4
pice_charset_saved: resb 040000h