; Taskmanager
; Chris Evans

MINSTACK EQU 1024
MAXSTACK EQU 32768

Taskrec:
        tstacksize dw ?
        taskstack  dd ?
        task_SP    dw ?
        task_SS    dw ?
        task_BP    dw ?
        Next_Task  dd ?
taskrec_size EQU $ - taskrec

; ===========================================================================
addtask proc far
; BX:DX = Startproc
; AX    = StackSize
; ===========================================================================
        cmp  ax, MINSTACK
        ja   chk_asmax
        mov  ax, MINSTACK
chk_asmax:
        cmp  ax, MAXSTACK
        jb   addstack1
        mov  ax, MAXSTACK
addstack1:
        ; T.STACKSIZE = STACKSIZE
        ; getmem (t.stack, stacksize)
        ; t.ss = SS
        ; t.sp = SP
        ; T.next = nil
        ret
addtask endp

; ===========================================================================
transfer proc far
; ===========================================================================
        les  si, akttask ; status
        mov  word ptr es:[si]+8, sp ; sp
        mov  word ptr es:[si]+6, ss ; ss
        mov  word ptr es:[si]+10, bp ; bp
        mov  ax, word ptr es:[si]+12 ; task next
        or   ax, word ptr es:[si]+14
        je   initnew
        les  si, es:[si]+12
        jmp  dojob
initnew:
        les  si, tasks
dojob:

        ret
transfer endp
