
        segment Pila stack
          resw 512
FinPila:

        ; Segmento de datos
        segment Datos
InicioDatos
; Este campo indicará el número
; de programas a ejecutar        
NumProgramas dw 3     
        
; Nombres de los programas       
Desc1 db 'Demostración de color en CGA$'
Prog1 db '.\puntocga.exe', 0
Desc2 db 'Demostración de color en EGA$'
Prog2 db '.\colorega.exe', 0
Desc3 db 'Efectos de color en VGA$'
Prog3 db '.\colorvga.exe', 0        
        
; Tabla de punteros a las
; cadenas con los nombres 
; de los programas
TblPunteros dw Desc1, Prog1
            dw Desc2, Prog2 
            dw Desc3, Prog3

; Bloque de parámetros para
; el servicio 4Bh de la int 21h
BloqueParametros
   dw 0 ; usar entorno del DOS
   dd LineaComandos ; cadena de parámetros
   dd FCB1, FCB2 ; FCBs  
   
LineaComandos db 0,13         
FCB1 resb 20
FCB2 resb 20
        
FinDatos        
        ; Segmento de código
        segment Codigo
..start:
InicioCodigo:
        ; Configuramos los
        ; registros de pila
        mov ax, Pila
        mov ss, ax
        mov sp, FinPila
        
        ; y los registros de
        ; segmento de datos
        mov ax, Datos
        mov ds, ax
     
        call AjustaMemoria

        push ds
        pop es
                    
        ; obtenemos el contador
        ; de programas a ejecutar
        mov cx, [NumProgramas]
        
        ; BX apunta a la tabla
        ; de punteros a cadenas
        mov bx, TblPunteros
        
Bucle: 
        ; obtenemos en DX la
        ; dirección de una cadena
        ; con la descripción del
        ; programa a ejecutar
        mov dx, [bx]        
        
        ; la mostramos
        mov ah, 9
        int 21h
        
        ; y esperamos una tecla
        mov ah, 0Ch
        mov al, 7
        int 21h
        
        ; nos desplazamos al 
        ; siguiente puntero
        add bx, 2
        
        ; recuperamos la dirección
        ; del nombre del programa
        mov dx, [bx]
        
        ; lo ejecutamos
        call Ejecuta
        
        ; pasamos al siguiente puntero
        add bx, 2
        
        ; y repetimos el proceso
        loop Bucle
        
        ; Devolvemos el control
        ; al sistema
        mov ah, 4ch
        int 21h

AjustaMemoria:
  mov	bx,FinCodigo-InicioCodigo+256
  add bx, FinPila
  add bx, FinDatos-InicioDatos+16
	shr	bx,4
	inc	bx	
	mov	ah,4ah	
	int	21h		
	ret
        
Ejecuta:
        push ds
        push es
        pusha

        ; ponemos AL a 0 para indicar
        ; que deseamos ejecutar
        xor al, al
        
        ; número del servicio
        mov ah, 4Bh
        
        ; DS:DX ya tiene la dirección
        ; del nombre del programa
        ; ES:BX debe apuntar al 
        ; bloque de parámetros
        
        ; dirección del bloque
        mov bx, BloqueParametros
        ; ejecutamos
        int 21h
        
        popa
        pop es 
        pop ds
       
        ret ; y volvemos
FinCodigo:                