;=----------------------------------------------------------------------------=;
;                            GNU GPL OS/K                                      ;
;                                                                              ;
;   Desc:   Basic Colored VGA Terminal Long mode Driver                        ;
;                   (x86_64 architecture only)                                 ;
;                                                                              ;
;                                                                              ;
;   Copyright © 2018-2019 The OS/K Team                                        ;
;                                                                              ;
;   This file is part of OS/K.                                                 ;
;                                                                              ;
;   OS/K is free software: you can redistribute it and/or modify               ;
;   it under the terms of the GNU General Public License as published by       ;
;   the Free Software Foundation, either version 3 of the License, or          ;
;   (at your option) any later version.                                        ;
;                                                                              ;
;   OS/K is distributed in the hope that it will be useful,                    ;
;   but WITHOUT ANY WARRANTY; without even the implied warranty of             ;
;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              ;
;   GNU General Public License for more details.                               ;
;                                                                              ;
;   You should have received a copy of the GNU General Public License          ;
;   along with OS/K.  If not, see <https://www.gnu.org/licenses/>.             ;
;=----------------------------------------------------------------------------=;

[BITS 64]
[section .text]

;;VIDEO
%define TRAM       0xB8000                      ; [T]ext[RAM]
%define VGA_HEIGHT 80

;; GLOBAL DATA
NextTRAM        dq  0xB8000                     ; Last position of cursor
NextTRAM32      dq  0xB8000                     ; Last position of cursor
VGA_X32         dq  0
VGA_HEIGHT64    dq  VGA_HEIGHT
VGA_X           dq  0

;-----------------------------------------------------------------------;
; x64/LM Clear Text Screen Function                                     ;
;-----------------------------------------------------------------------;
clear:
    mov qword [NextTRAM], TRAM
    mov edi, TRAM
    push rsi
    push rdi
    push rcx
    mov ah, 0
    mov al, 0
    mov rcx, 0x4000                             ; traditionnal value
    rep stosw                                   ; fill screen with al while cx > 0
    pop rcx
    pop rsi
    pop rdi
    ret


;-----------------------------------------------------------------------;
; x64/LM Text Printing Functions                                        ;
; bl  : color code                                                      ;
; esi : string address                                                  ;
;-----------------------------------------------------------------------;
write:
    mov  edi, [NextTRAM]                        ; TRAM ADDRESS
    push rsi
    push rdi
.pLoop:
    lodsb
    cmp al, 0                                   ; while @al, i.e. while we're not hitting '\0'
    je .pEnd
    cmp al, 0x0A                                ; LF
    je .lf
    cmp al, 0x0D                                ; CR
    je .cr
    stosb                                       ; text subpixel
    mov al, bl
    stosb                                       ; color subpixel
    add qword [NextTRAM], 0x2                   ; Cursor moving
    add qword [VGA_X], 0x2                      ; coord + 2 because 2 subpixels
    jmp .pLoop
.pEnd:
    pop rdi
    pop rsi
    ret
.lf:
    mov rax, [VGA_HEIGHT64]
    add [NextTRAM], rax                         ; Cursor moving
    add [NextTRAM], rax
    add edi, eax                                ; Address moving
    add edi, eax
    jmp .pLoop
.cr:
    push rax
    mov rax, qword [VGA_X]
    sub qword [NextTRAM], rax                   ; pos = X + Y * VGA_HEIGHT64. Donc pos - X = début de ligne
    sub edi, edx
    mov qword [VGA_X], 0
    pop rax
    jmp .pLoop
.scroll:
    ; XXX I don't think I'll implement this, but never know...;
    jmp .pLoop

dump:
;-----------------------------------------------------------------------;
; x64/LM Dump 512 bytes of a buffer                                     ;
; bl  : color code                                                      ;
; esi : buffer address                                                  ;
;-----------------------------------------------------------------------;
    mov  edi, [NextTRAM]                        ; TRAM ADDRESS
    push rsi
    push rdi
    push rcx
    mov rcx, 512
.pLoop:
    lodsb
    stosb                                       ; text subpixel
    mov al, bl
    stosb                                       ; color subpixel
    loop .pLoop
    pop rcx
    pop rdi
    pop rsi
    add qword [NextTRAM], 1000                  ; Cursor moving : 1120 = 80 * 2 * 7 lignes
    ret

[BITS 32]
;-----------------------------------------------------------------------;
; x32 Text Printing Functions                                           ;
; bl  : color code                                                      ;
; esi : string address                                                  ;
;-----------------------------------------------------------------------;
write32:
    mov  edi, TRAM                              ; TRAM ADDRESS
    push esi
    push edi
.pLoop:
    lodsb
    cmp al, 0                                   ; while @al, i.e. while we're not hitting '\0'
    je .pEnd
    stosb                                       ; text subpixel
    mov al, bl
    stosb                                       ; color subpixel
    jmp .pLoop
.pEnd:
    pop edi
    pop esi
    ret

disable_cursor:
    pushf
    push eax
    push edx

    mov dx, 0x3D4
    mov al, 0xA                                 ; low cursor shape register
    out dx, al

    inc dx
    mov al, 0x20                                ; bits 6-7 unused, bit 5 disables the cursor, bits 0-4 control the cursor shape
    out dx, al

    pop edx
    pop eax
    popf

    ret

[BITS 64]