Files
low-level-programming/x86_vram_functions.asm
2015-09-18 02:56:07 -07:00

58 lines
1.2 KiB
NASM

%include "x86_vram.asm"
; first argument is row, 1 byte
; second argument is column, 1 byte
; third argument is cell, 2 bytes
global write_to_coord
write_to_coord:
push ebp
mov ebp, esp
push edi
push ebx
; should do the same thing
;call get_vram_offset
;mov edi, eax
mov edi, X86_VRAM
mov ebx, [ebp+8]
imul ebx, X86_COLS*2
add ebx, [ebp+12]
add ebx, [ebp+12]
add edi, ebx ;edi now has effective address
mov ebx, [ebp+16] ;; load word into ebx
mov [edi], bx
pop ebx
pop edi
mov esp, ebp
pop ebp
ret
; takes character/attribute in edi
; writes it to all cells on screen
global clear
clear:
push ebp
mov ebp, esp
push edi
; movzx - move and zero-extend
; this trick lets us write half as many doublewords to vram
movzx eax, word [ebp + 8]
mov edx, eax
shl eax, 16
or eax, edx
; stosd stores eax at the address in edi (here, vram)
; and then increments edi
; rep stosd repeats stosd while ecx is nonzero
mov edi, X86_VRAM
mov ecx, X86_COLS * X86_ROWS / 2
rep stosd ; "A REP STOS instruction is the fastest way to initialize a large block of memory."
pop edi
mov esp, ebp
pop ebp
ret