VIDEO_MEMORY equ 0xb8000 VIDEO_COLS equ 80 VIDEO_ROWS equ 25 CURSOR_X: dw 0 CURSOR_Y: dw 0 pm_print_newline: push eax mov [CURSOR_X], word 0 mov ax, [CURSOR_Y] inc ax mov [CURSOR_Y], ax pop eax call update_vga_cursor ret ; IN si pm_print_string: push eax .loop: lodsb cmp al, 0 je .fini call pm_print_char jmp .loop .fini: pop eax ret ; IN al: character to print pm_print_char: push edx push ecx push ebx push eax mov ax, [CURSOR_Y] mov cl, VIDEO_COLS mul cl mov bx, [CURSOR_X] add ax, bx shl ax, 1 mov edx, VIDEO_MEMORY add dx, ax pop eax mov ah, 0x07 mov [edx], ax pop ebx pop ecx pop edx call inc_cursor ret ; IN dx: hex value to print pm_print_hex: push bx push si mov si, PM_HEX_TEMPLATE mov bx, dx shr bx, 12 mov bx, [PM_HEXABET+bx] mov [PM_HEX_TEMPLATE+2], bl mov bx, dx and bx, 0x0FFF shr bx, 8 mov bx, [PM_HEXABET+bx] mov [PM_HEX_TEMPLATE+3], bl mov bx, dx and bx, 0x00FF shr bx, 4 mov bx, [PM_HEXABET+bx] mov [PM_HEX_TEMPLATE+4], bl mov bx, dx and bx, 0x000F mov bx, [PM_HEXABET+bx] mov [PM_HEX_TEMPLATE+5], bl call pm_print_string pop si pop bx ret inc_cursor: push eax mov ax, [CURSOR_X] inc ax mov [CURSOR_X], ax cmp ax, VIDEO_COLS jl .fini mov [CURSOR_X], word 1 mov ax, [CURSOR_Y] inc ax mov [CURSOR_Y], ax cmp ax, VIDEO_ROWS jl .fini ; TODO: scoll one line, for now restart on top mov [CURSOR_Y], word 0 .fini: call update_vga_cursor pop eax ret ; update the VGA cursor on screen update_vga_cursor: push eax push ebx push ecx push edx mov al, [CURSOR_Y] mov cl, VIDEO_COLS mul cl mov bx, ax movzx ax, [CURSOR_X] add bx, ax mov cx, bx ;cursor LOW port to vga INDEX register mov al, 0fh ;Cursor Location Low Register -- mov dx, 3d4h ;VGA port 3D4h out dx, al mov ax, cx ;restore 'postion' back to AX mov dx, 3d5h ;VGA port 3D5h out dx, al ;send to VGA hardware ;cursor HIGH port to vga INDEX register mov al, 0eh mov dx, 3d4h ;VGA port 3D4h out dx, al mov ax, cx ;restore 'position' back to AX shr ax, 8 ;get high byte in 'position' mov dx, 3d5h ;VGA port 3D5h out dx, al ;send to VGA hardware pop edx pop ecx pop ebx pop eax ret ; read cursor from hardware read_hardware_vga_cursor: push eax push ebx push ecx push edx xor eax, eax xor ebx, ebx mov al, 0eh mov dx, 3d4h out dx, al mov dx, 3d5h in al, dx mov bh, al mov al, 0fh mov dx, 3d4h out dx, al mov dx, 3d5h in al, dx mov bl, al mov ax, bx mov edx, 0 mov cx, VIDEO_COLS div cx mov [CURSOR_X], dx mov [CURSOR_Y], ax pop edx pop ecx pop ebx pop eax ret PM_HEX_TEMPLATE: db '0x???? ', 0 PM_HEXABET: db '0123456789ABCDEF'