diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-10 20:55:56 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-10 20:55:56 +0200 |
commit | eea5bf4b859eb56c5772c58ca54937a90a10e7ee (patch) | |
tree | 391b31a28a3740d3fd52a9a9d1c651bc9f12cc2b /src/boot/stage2_pm_functions.asm | |
parent | 1625a4752545e54c439a38f3393ab9d72bfee721 (diff) | |
download | abaos-eea5bf4b859eb56c5772c58ca54937a90a10e7ee.tar.gz abaos-eea5bf4b859eb56c5772c58ca54937a90a10e7ee.tar.bz2 |
moved bootloader to subdirectory
Diffstat (limited to 'src/boot/stage2_pm_functions.asm')
-rw-r--r-- | src/boot/stage2_pm_functions.asm | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/boot/stage2_pm_functions.asm b/src/boot/stage2_pm_functions.asm new file mode 100644 index 0000000..f3c348b --- /dev/null +++ b/src/boot/stage2_pm_functions.asm @@ -0,0 +1,177 @@ +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' + |