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