; virmem.c
%pragma once
bits 16

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

init:
    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 0,0
    pusha
    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
    pf "gdtentry @ ds:0x%x",si
    mov word cx,ds:[si]
    pf "  Limit:  0x%x",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
    pf "  Base:   %x:%x",di,cx
    
    mov bx,gdtentry.xs
    xor cx,cx
    mov byte cl,ds:[si+bx]
    pf "  Access: 0x%x",cx

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

; findentry :: void -> int8 gdtidx
findentry:











