;-----------------------------------------------------------------------; ; add_alias ; ; ; Entry: ; AX = alias ; BX = base ; ; Returns: ; AX = 1 success ; ; Error Returns: ; AX = 0 ; ; Registers Destroyed: ; ; History: ; Sat 13-May-1989 09:16:09 -by- David N. Weise [davidw] ; Stole it! ;-----------------------------------------------------------------------; assumes ds,nothing assumes es,nothing cProc add_alias,, cBegin SetKernelDS ES mov dx,ax mov es,sel_alias_array UnSetKernelDS ES aa_look: mov cx,es:[sa_size] shr cx,1 mov di, SIZE SASTRUC xor ax,ax repnz scasw jcxz aa_grow and bl,NOT 07h ; remove RPL bits and dl,NOT 07h ; remove RPL bits mov es:[di][-2].sae_sel,bx mov es:[di][-2].sae_alias,dx mov ax,1 ; return success jmps aa_exit aa_grow: xor di,di mov ax,es:[di].sa_size add ax,SIZE SASTRUC + ((SIZE SAENTRY) * 8) push ax push bx push dx push es cCall GlobalRealloc, pop es pop dx pop bx or ax,ax ; did we get the memory? pop ax jz aa_exit sub ax,SIZE SASTRUC mov es:[di].sa_size,ax ; reset the size jmps aa_look aa_exit: cEnd ;-----------------------------------------------------------------------; ; delete_alias ; ; Checks to see if the passed selector is an alias, if ; so it frees the entry in the array. ; ; Entry: ; AX = selector to free ; Returns: ; ES:DI => alias struct ; ; Registers Destroyed: ; ; History: ; Sat 13-May-1989 09:16:09 -by- David N. Weise [davidw] ; Stole it! ;-----------------------------------------------------------------------; assumes ds,nothing assumes es,nothing cProc delete_alias, cBegin ; int 3 SetKernelDS ES mov es,sel_alias_array xor di,di mov cx,es:[di].sa_size shr cx,1 mov di, SIZE SASTRUC and al,NOT 07h ; remove RPL bits da_keep_looking: repnz scasw jcxz da_exit .errnz sae_sel - 0 .errnz sae_alias - 2 .errnz (SIZE SASTRUC) - 4 test di,2 ; we avoid problems this way jnz da_keep_looking sub di,4 xor ax,ax mov es:[di].sae_alias,ax mov es:[di].sae_sel,ax da_exit: cEnd ;-----------------------------------------------------------------------; ; get_alias_from_original ; ; ; Entry: ; AX = original selector ; ; Returns: ; BX = alias ; = 0 if no alias ; ES:DI => alias struct ; ; Registers Destroyed: ; ; History: ; Sat 13-May-1989 09:16:09 -by- David N. Weise [davidw] ; Stole it! ;-----------------------------------------------------------------------; assumes ds,nothing assumes es,nothing cProc get_alias_from_original, cBegin nogen ; int 3 SetKernelDS ES mov es,sel_alias_array UnsetKernelDS ES xor di,di mov cx,es:[di].sa_size mov di,SIZE SASTRUC shr cx,1 and al,NOT 07h ; remove RPL bits gafo_keep_looking: cld repnz scasw xor bx,bx jcxz gafo_exit .errnz sae_sel - 0 .errnz sae_alias - 2 .errnz (SIZE SASTRUC) - 4 test di,2 ; we avoid problems this way jz gafo_keep_looking sub di,2 ; int 3 mov bx,es:[di].sae_alias gafo_exit: ret cEnd nogen ;-----------------------------------------------------------------------; ; get_original_from_alias ; ; ; Entry: ; AX = alias selector ; ; Returns: ; BX = original selector ; = 0 if no alias ; ES:DI => alias struct ; ; Registers Destroyed: ; ; History: ; Sat 13-May-1989 09:16:09 -by- David N. Weise [davidw] ; Stole it! ;-----------------------------------------------------------------------; assumes ds,nothing assumes es,nothing cProc get_original_from_alias, cBegin nogen ; int 3 SetKernelDS ES mov es,sel_alias_array xor di,di mov cx,es:[di].sa_size mov di,SIZE SASTRUC shr cx,1 and al,NOT 07h ; remove RPL bits gofa_keep_looking: cld repnz scasw xor bx,bx jcxz gofa_exit .errnz sae_sel - 0 .errnz sae_alias - 2 .errnz (SIZE SASTRUC) - 4 test di,2 ; we avoid problems this way jnz gofa_keep_looking sub di,4 ; int 3 mov bx,es:[di].sae_sel gofa_exit: ret cEnd nogen ;-----------------------------------------------------------------------; ; check_for_alias ; ; ; Entry: ; parmW selector that moved ; parmD new address ; ; Returns: ; ; Registers Destroyed: ; ; History: ; Wed 17-Jan-1990 02:07:41 -by- David N. Weise [davidw] ; Wrote it! ;-----------------------------------------------------------------------; assumes ds,nothing assumes es,nothing cProc check_for_alias,, parmW selector parmD new_address cBegin ; int 3 pusha pushf mov ax,selector call get_alias_from_original or bx,bx jz cfa_exit ; int 3 mov dx,new_address.hi mov ax,new_address.lo cCall set_physical_address, cfa_exit: popf popa cEnd ;-----------------------------------------------------------------------; ; wipe_out_alias ; ; This little routine is called when a global memory object ; is being freed. We search for an alias, if one is found ; then it is freed. ; ; Entry: ; DX = handle that might have an alias associated with it ; ; Returns: ; nothing ; ; Registers Destroyed: ; ; History: ; Thu 18-Jan-1990 00:43:13 -by- David N. Weise [davidw] ; Wrote it! ;-----------------------------------------------------------------------; assumes ds,nothing assumes es,nothing cProc wipe_out_alias,, cBegin ; int 3 mov ax,dx call get_alias_from_original or bx,bx jz woa_exit ; int 3 xor ax,ax mov es:[di].sae_sel,ax xchg es:[di].sae_alias,ax cCall FreeSelector, woa_exit: cEnd