Re: Returned Exit Code

Area:    Quik_Bas
  Msg:    #362
 Date:    12-19-92 21:47 (Public) 
 From:    Rob McKee                
 To:      Peter Barney             
 Subject: Re: Returned Exit Code   
 >  my ERLV.COM debug source
 >  debug <erlv.src
 >  -----------------------8<-----------------------------
 >  a      ; v----  change this to reflect your system
 >  MOV AX,054B   ; Hard coded for my system.  &h2b3 after the start of
 >  PUSH    DS    ; first Command.com listed from "mem /d"

 PB> Wouldn't you want to use the SECOND command.com?  If not, 
 PB> couldn't you just look at the PSP's Parent_Id (word at 
 PB> offset 16h) to tell you where the original command.com is located?

 >   I want to be able to read the list of list and have the program
 > automatically go to the right byte and get it on any Dos 5 computer,
 > though...

 PB> What is the list of lists?

 DOS keeps a masterlist of the start of many things like Memory control 
blocks MCB, pointers to device drivers, etc...  MCB are 
better suited for finding COMMAND than PSP.  a MCB preceeds 
each PSP and it easier to step through them.  The following 
is the New and better ERLV.COM which runs on any Dos 5 w/ 
COMMAND.COM platform.  I've tested it on a 286/20, IBM XT, 
Zenith 150, and a 486-DX2.  It works inside batch files, it 
works outside. it works shelled even..  Although it does 
return the Errorlevel given by the previos program.  The 
parent hasn't exited yet so no errorlevel from them yet.  
It works when shelled into command.com with or without a 
batch file.  Supports redirection even... into a file  '>', 
 not out off one '<'.  Some one with MASM experiance should 
be able to modify the code so it could be a Obj.. then a 
Lib function.
                                                      
 Erlv.a86 used by A86.COM the shareware Assembler.
 -------------------------8<--------------------
 ORG 0100
     jmp main
     Cur_Blk DW ?
     MCB_Seg dw ?
     Last_CMD dw ?
     Next_MCB dw ?
     out_100 db 0
     out_10  db 0
     out_1   db 0
     out_str db 0d,0a,024
     ErrorLevel db 00
     NotDos5msg db 'This Program Only runs with'
     ContNotDos5 db ' Dos5 and COMMAND.COM',0d,0a,024
     OopsMsg db 'This Program Has problems',0d,0a,024
 main:
     push ds
     push ds
     push ds
     push ds
     push ds
     mov ah,030
     int 33
     cmp ax,5
     je isDos5
 NotDos5:
     mov dx,offset NotDos5msg
     Call outstr
     jmp exit0
 Oops:
     mov dx,offset OopsMsg
     call outStr
     jmp exit0
 outstr:
     mov ah,9
     int 33
     ret
 Exit0:
     mov ax,04c00
     int 33
 isDos5:
     ; Get list of lists
     mov ah,052
     int 33    ; int 021xh
     ; es:bx-2 has list of lists
     dec bx
     dec bx
     mov si,bx
     es:
     mov ax,[si]    ; save a copy of MCB segment
     cs:
     mov MCB_Seg,ax
 MCB_Next:
     mov ds,ax
     mov cs:Cur_blk,ax
     mov ds:ah,[0]      ; get first byte of MCB
     mov bx,ds          ; Start of block
     add bx,w[3]        ; add Size of Block controled by MCB
     add bx,1           ; add 1 to give start of next MCB
     cmp ah,05a         ; Last one??
     je Chk_Lst_CMD     ; If yes then go do it.
     cmp ah,04d         ; if it's  a &h4d then it's a MCB
     je isMCB
     jmp Oops        ; looks like we're in lala land EXIT! EXIT!




 IsMCB:
     pop ds           ; lets get the data segment right!
     push ds
     mov Next_MCB,bx  ; Save the start of next MCB
     mov ax,Cur_blk   ; Restore Cur_Blk
     mov es,ax        ; setup Aux segment register
     es:              ; use it.
     cmp byte [8],043        ; I could have done this differently but hey!
     jne getNextMCB          ; the program is still less than 1 sector...
     es:
     cmp byte [9],04f      ; does it say 'COMMAND'
     jne getNextMCB
     es:
     cmp byte [10],04d
     jne getNextMCB
     es:
     cmp byte [11],04d
     jne getNextMCB
     es:
     cmp byte [12],041
     jne getNextMCB
     es:
     cmp byte [13],04e
     jne getNextMCB
     es:
     cmp byte [14],044
     jne getNextMCB
     ds:
     mov ax,Cur_Blk    ; Yep, it says 'COMMAND' what the segement again?
     mov Last_CMD,ax   ; save it
 GetNextMCB:           ; check the next MCB for 'COMMAND'
     ds:
     mov ax,Next_MCB
     jmp MCB_Next
 Chk_Lst_CMD:
     push cs
     pop ds
     mov ax,Last_CMD    ; Check to see if we found one.
     cmp ax,0
     jg  AddCur         ; If yes do it to it.
     jmp long Exit0
 AddCur:
     mov ax,Last_CMD    ; get the last cmd segemnt again
     add ax,02b         ; add the offset
     mov es,ax
     es:                ; use it
     mov al,b[3]        ; get the Errorlevel
     ds:                ; restore the data segemnt
     mov byte ErrorLevel,al      ; save it
     push cs
     pop ds
     MOV CL,030                  ; setup for addition
     CMP AL,00                   ; Is the Errorlevel 0
     JZ  JMP2                    ; if it is don't divide jump to the adding
     XOR AH,AH
     MOV BX,000A        ; divide by 10
     DIV BL
     MOV Out_1,AH       ; remainder is the 1's digit
     XOR AH,AH          ; zero out ah
     DIV BL             ; divide again
     MOV Out_10,AH      ; move the 10's digit
     MOV Out_100,AL     ; all thats left is the 100's digit
 JMP2:
      ADD Out_1,CL      ; make the remainders ASCII
      ADD Out_10,CL
      ADD Out_100,CL
      MOV DX,Offset Out_100       ; setup the offset to string
     Call OutStr                  ; display it
      MOV AL,ErrorLevel           ; restore Errorlevel
      MOV AH,04c                  ; so when we exit the IF ERRORLEVEL x
      INT 021                     ; in the Batch file will work
                -------------------------8<--------------------
                                                                       TTYL
                                      -Rob


--- EZPoint V2.2
 * Origin: Flyer Proof Computer Services (1:125/1212.13)


Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET