; virmem.c
%pragma once
bits 16

; Valloc :: addr24 *hi:low -> int8 access -> int16 descriptor
Valloc:

init:
 .init:
    mov ax,0xfffe
    mov bx,0x0020
    mov ds,bx
    mov es,bx
    mov ss,bx
    mov sp,ax
    mov cx,ax
    pf "We are inside the kernel!"

 .main:
    mov ax,0x0028
    push ax
    mov ax,0x0028
    push ax
    call show
    add sp,0x0004

 .halt:
    cli
    hlt
 .loop:
    nop
    jmp .loop
    retf

; addentry :: gdtentry *seg:dest -> addr24 *hi:low -> int8 access -> void
adddentry:
    enter 0,0
    pusha

    mov cx,[bp+4]           ; cx=dest seg
    mov di,[bp+6]           ; di=dest
    mov bx,[bp+8]           ; bl=hi addr
    mov si,[bp+10]           ; si=lo addr
    mov dx,[bp+12]          ; dl=access byte

    chseg(es,cx)
    set(di, 0, 8)
    mov dh,bl               ; dh=hi addr

    mov word es:[di],0xffff
    mov bx,gdtentry.baselo
    mov word es:[di+bx],si
    mov bx,gdtentry.basehi
    mov byte es:[di+bx],dh
    mov bx,gdtentry.xs
    mov byte es:[di+bx],dl

    sret(es)
    popa
    xor ax,ax
    clc
    leave
    ret

; show :: gdtentry *seg:addr -> void
show:
    enter 9,0
    pusha

    %define Gdtentry    bp-0
    %define Limit       bp-2
    %define Basehi      bp-4
    %define Baselow     bp-6
    %define Access      bp-8

    mov dx,[bp+4]       ; dx=seg
    mov si,[bp+6]       ; si=addr

    chseg(ds,dx)
;struc gdtentry
;    .limit:   resw 1
;    .baselo:  resw 1
;    .basehi   resb 1
;    .xs:      resb 1
;    .reserv:  resw 1
;endstruc
    mov word [Gdtentry],si
    mov word cx,ds:[si]
    mov word [Limit],cx

    mov bx,gdtentry.baselo
    mov word cx,ds:[si+bx]
    mov bx,gdtentry.basehi
    xor ax,ax
    mov byte al,ds:[si+bx]
    mov di,ax
    mov word [Basehi],di
    mov word [Baselow],cx
    
    mov bx,gdtentry.xs
    mov byte cl,ds:[si+bx]
    mov byte [Access],cl

    sret(ds)
    pf "gdtentry @ ds:0x%x",[Gdtentry]
    pf "  Limit:  0x%x",[Limit]
    pf "  Base:   %x:",[Basehi]
    pf "          0x%x",[Baselow]
    xor cx,cx
    mov byte cl,[Access]
    pf "  Access: 0x%x",cx
    popa

    %undef Gdtentry
    %undef Limit
    %undef Basehi
    %undef Baselow
    %undef Access

    xor ax,ax
    clc
    leave
    ret

; findentry :: void -> int8 gdtidx
findentry:











