weno en este tuto veran como dejar un programa residente por MCB (memory control block)
formato del MCB:
dirección Contenido Tipo
+00h ID (Z = ultimo, M = hay mas) 1 BYTE
+01h dirección del segmento del PSP asociado 1 WORD
+03h Nº de párrafos en la zona de memoria alojada 1 WORD
+05h No se usa 11 BYTES
+10h La zona de memoria alojada x PARRAF
ok para dejar nuestro programa residente por MCB (con DOS) tenemos que:
-Saber si es .com o .exe
--Si es .com sakamos psp (si en exe trabajamos con ds)
--* mov bx, cs |otra forma de sakr psp y ver si tenemos copias es (psp a bx):
mov dx,0f904
mov ah,62
int 21
--Le restamos 1 a bx para encontrar la direccion de MCB y movemos a data
--* dec bx
mov ds, bx
--en si+3 se encuentra la cantidad de memoria alojada, hay le restamos la longitud del programa
--* sub word ptr [si+3],prg_lng
--ya que tenemos la cantidad de memoria tenemos que liberarla
--* mov ax,word ptr [si+3] ;guardamos el resultado en ax
mov dx,ax ;en bx la nueva memoria a liberar
push cs
pop es
mov ah,4ah ;funcion para liberar memoria
int 21h
--aora tenemos q asignar la memoria liberada al programa:
--* pop bx ;sakmos la cantidad
dec bx ;DOS usara un DWORD asiq se lo dejamos
mov ah, 48h ;funcion para asignar
int 21h
--listo, aora podemos usar una tecnica que usa DOS para identificar sus partes y esto es identificar su 1er offset con "8" XD..
--* dec ax
mov es, ax
mov word ptr es:[1], 8
mov word ptr es:[8],'XX'
inc ax
mov es, ax
push es
rep movsb ;listo, dejamos residente
....aki para modificar MCB directamente:
mov dx,0f904
mov ah,62 ; lo mismo q con DOS, sakamos psp
int 21
dec bx ; vamos a MCB
mov ds,bx
sub word ptr [si+3],prg_lng
sub word ptr [si+12],prg_lng ; movemos a DOS tmbn
mov ds,si ; reservams 2K de memoria
mov es,dx
push cs
pop ds
mov si,offset inicio
mov di,si
mov cx,(fin - inicio) / 2
rep movsw ;residentes!
weno suficiente ... espero q les sirva!
Saludos!