203 lines
3.2 KiB
NASM
203 lines
3.2 KiB
NASM
PUBLIC _enableUnchainedVGAMode
|
|
PUBLIC _enableTextMode
|
|
PUBLIC _fillScreen
|
|
PUBLIC _latchCopyCube
|
|
PUBLIC _paramTest
|
|
PUBLIC _keyboardPressed
|
|
PUBLIC _keyboardHandler
|
|
|
|
DISPLAY_MODE_VGA equ 13h
|
|
DISPLAY_MODE_TEXT equ 03h
|
|
|
|
VGA_SEQUENCE_CONTROLLER_INDEX equ 0x3c4
|
|
VGA_SEQUENCE_CONTROLLER_DATA equ 0x3c5
|
|
VGA_SEQUENCE_CONTROLLER_MEMORY_MODE equ 0x04
|
|
|
|
VGA_SEQUENCE_CONTROLLER_MAP_MASK_MODE equ 0x02
|
|
|
|
VGA_GRAPHICS_MODE_INDEX equ 0x3CE
|
|
VGA_GRAPHICS_MODE equ 0x05
|
|
|
|
VGA_CRT_CONTROLLER_INDEX equ 0x03d4
|
|
VGA_CRT_CONTROLLER_DATA equ 0x03d5
|
|
VGA_CRT_CONTROLLER_UNDERLINE_LOC equ 0x14
|
|
VGA_CRT_CONTROLLER_MODE_CONTROL equ 0x17
|
|
|
|
.386
|
|
.model flat,c
|
|
|
|
.DATA
|
|
|
|
_keyboardPressed dd 0
|
|
|
|
.CODE
|
|
|
|
_keyboardHandler:
|
|
cli
|
|
push eax
|
|
push ebx
|
|
|
|
in al, 0x60
|
|
mov bl, al
|
|
|
|
; acknowledge keyboard
|
|
in al, 0x61
|
|
mov ah, al
|
|
or al, 0x80
|
|
out 0x61, al
|
|
xchg ah, al
|
|
out 0x61, al
|
|
|
|
and bl,0x80
|
|
jne _keyboardHandler_notKeydown
|
|
|
|
mov [_keyboardPressed], 1
|
|
_keyboardHandler_notKeydown:
|
|
; acknowledge interrupt
|
|
mov al, 0x20
|
|
out 0x20, al
|
|
|
|
pop ebx
|
|
pop eax
|
|
sti
|
|
iretd
|
|
|
|
_enableUnchainedVGAMode:
|
|
mov ax,0x0013;
|
|
int 0x10
|
|
|
|
mov dx, VGA_SEQUENCE_CONTROLLER_INDEX
|
|
mov al, VGA_SEQUENCE_CONTROLLER_MEMORY_MODE
|
|
mov ah, 0x06
|
|
out dx, ax
|
|
|
|
mov dx, VGA_CRT_CONTROLLER_INDEX
|
|
mov al, VGA_CRT_CONTROLLER_MODE_CONTROL
|
|
mov ah, 0xe3
|
|
out dx, ax
|
|
|
|
mov dx, VGA_CRT_CONTROLLER_INDEX
|
|
mov al, VGA_CRT_CONTROLLER_UNDERLINE_LOC
|
|
mov ah, 0x00
|
|
out dx, ax
|
|
|
|
ret
|
|
|
|
_enableTextMode:
|
|
mov ah,0h
|
|
mov al,DISPLAY_MODE_TEXT
|
|
int 10h
|
|
ret
|
|
|
|
_fillScreen:
|
|
push ebp
|
|
mov ebp, esp
|
|
|
|
; set all bitplanes
|
|
mov dx, VGA_SEQUENCE_CONTROLLER_INDEX
|
|
mov al, 0x02
|
|
mov ah, 0fh
|
|
out dx, ax
|
|
|
|
mov al, [ebp+8] ; requested color
|
|
|
|
mov cx, 16000 ; loop index
|
|
mov ebx, 0xa0000
|
|
_fillScreen_loop:
|
|
mov BYTE PTR [ebx], al
|
|
inc ebx
|
|
loop _fillScreen_loop
|
|
|
|
mov esp,ebp
|
|
pop ebp
|
|
|
|
ret
|
|
|
|
_paramTest:
|
|
push ebp
|
|
mov ebp,esp
|
|
|
|
mov eax,0
|
|
mov al, BYTE PTR [ebp+8]
|
|
|
|
mov esp,ebp
|
|
pop ebp
|
|
ret
|
|
|
|
_latchCopyCube:
|
|
push ebp
|
|
mov ebp,esp
|
|
; we need a y variable
|
|
sub esp,4 ; y
|
|
|
|
push edx
|
|
push ebx
|
|
|
|
; accept a mode
|
|
; accept a mix value
|
|
; accept an x offset
|
|
|
|
; [ebp+8] is x offset
|
|
; [ebp+12] is written value
|
|
; [ebp+16] is data rotate register
|
|
|
|
; enable latch reads on all planes
|
|
mov dx, VGA_SEQUENCE_CONTROLLER_INDEX
|
|
mov al, VGA_SEQUENCE_CONTROLLER_MAP_MASK_MODE
|
|
mov ah, 0xf
|
|
out dx, ax
|
|
|
|
; enable OR writes
|
|
mov dx, VGA_GRAPHICS_MODE_INDEX
|
|
mov al, 0x03
|
|
mov ah, [ebp+16]
|
|
out dx, ax
|
|
|
|
mov dh, [ebp+12]
|
|
|
|
mov DWORD PTR [ebp-4],16 ; y
|
|
; read across the cube, should take 4 * 16 reads
|
|
mov cx,[ebp-4]
|
|
_latchCopyCube_yLoop:
|
|
mov [ebp-4],cx ; put y back in loop
|
|
|
|
mov eax,[ebp-4] ; put y in eax
|
|
dec eax ; offset by 1 for loop
|
|
; can only multiply in eax by register
|
|
mov bl,80
|
|
mul bl ; number of lines
|
|
add eax,0xa0000 ; vga base address
|
|
|
|
; keep our index handy
|
|
mov ebx, [ebp+8]
|
|
|
|
; start x loop
|
|
mov cx,4
|
|
_latchCopyCube_xLoop:
|
|
; fill latches via memory read
|
|
mov dl, BYTE PTR [eax]
|
|
|
|
; write blank
|
|
mov BYTE PTR [eax+ebx], dh
|
|
|
|
; increment vga pointer
|
|
inc eax
|
|
|
|
; loop until x is 0
|
|
loop _latchCopyCube_xLoop
|
|
|
|
; restore y for looping
|
|
mov cx,[ebp-4]
|
|
|
|
; loop until y is 0
|
|
loop _latchCopyCube_yLoop
|
|
|
|
; put things back
|
|
pop ebx
|
|
pop edx
|
|
mov esp,ebp
|
|
pop ebp
|
|
ret
|
|
|
|
end
|