home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / sysutl / toadexec.arc / TOADTIMR.ASM < prev   
Assembly Source File  |  1988-06-30  |  6KB  |  245 lines

  1. TITLE    Exec Timer
  2.  
  3. ; Execute a program, displaying start and end times.
  4. ; David Kirschbaum
  5. ; Toad Hall
  6. ; kirsch@braggvax.ARPA
  7.  
  8. AscMask    equ    2710H        ; Asciifying mask
  9. CR    equ    0DH
  10. LF    equ    0AH
  11.  
  12. CSeg    SEGMENT    'CODE'
  13.     ASSUME    CS:CSeg,DS:CSeg,ES:CSeg
  14.  
  15.     org    2CH
  16. envaddr    dw    ?                ;Environment address
  17.  
  18.     org    80H                ;PSP cmd line [TH]
  19. PSPcmdline    db    ?
  20.  
  21.     ORG    100H                ; Program entry point
  22.  
  23. Timer    proc    far
  24.  
  25.     MOV    SP,OFFSET stack            ; Set up local stack
  26.  
  27.     MOV    BX,OFFSET lastloc+15        ; BX := program size in
  28.     MOV    CX,4                ;  paragraphs
  29.     SHR    BX,CL                ;memory requested in paras
  30.  
  31.     MOV    ah,4AH                ; Deallocate unused memory
  32.     INT    21H
  33.  
  34.     mov    ax,envaddr            ;TH get environment addr
  35.     MOV    parmblk,AX            ;stuff in parameter block
  36.  
  37.     MOV    AX,CS                ; Set segment registers
  38.     MOV    parmblk+4,AX            ;  in parameter block
  39.     MOV    parmblk+8,AX            ; to our Code Seg
  40.     MOV    parmblk+12,AX
  41.  
  42. ;TH move PSP command line into our own working buffer
  43.     mov    si,offset PSPcmdline        ;point to PSP cmd line
  44.     mov    di,offset comline        ;point to our own cmd line buff
  45.     xor    ax,ax                ;insure msb is clear
  46.     cld                    ;insure fwd
  47.     lodsb                    ;snarf cmd line length byte
  48.     or    ax,ax                ;anything there?
  49.     je    NoCmd                ; nope, use default
  50.     mov    cx,ax                ;into cx as a counter
  51. ;TH si now points to first char of PSP cmd line
  52.     inc    ax                ;+2 for '/C' already there
  53.     inc    ax
  54.     stosb                    ;force working cmd line len
  55.     inc    di                ;bump past "/C"
  56.     inc    di
  57.     rep    movsb                ;transfer cmd line
  58. NoCmd:
  59.     call    Start_Time            ;update time buffer
  60.     mov    dx,offset StartMsg        ;'Start: '
  61.     mov    ah,9                ;display string
  62.     int    21H
  63.     mov    dx,offset timebuff        ;'hh:mm:ss.dd'
  64.     mov    ah,9                ;display string
  65.     int    21H
  66. ;end of Toad Hall code
  67.  
  68.     MOV    DX,OFFSET filenam        ; Set up exec call
  69.     MOV    BX,OFFSET parmblk
  70.     MOV    AX,4B00H            ;DOS Exec function
  71.  
  72.     PUSH    DS                ; Save machine state
  73.     PUSH    ES
  74.     mov    savess,SS            ;TH
  75.     mov    savesp,SP            ;TH
  76.     INT    21H                ; Shell to DOS
  77.  
  78. ;TH seem to recall something about disabling interrupts
  79. ; before fiddling these registers, but can't remember just what!
  80. ; Seems to work ok, so will leave it be for now.
  81.  
  82.     MOV    SP,CS:savesp            ; Restore machine state
  83.     MOV    SS,CS:savess
  84.     POP    ES
  85.     POP    DS
  86.  
  87. ;more Toad Hall Code
  88.     push    ax                ;Save any program errorlevels
  89.     cld                    ;insure still forward
  90.  
  91.     call    End_Time            ;TH update time buffer
  92.     mov    dx,offset EndMsg        ;'Elapsed: hh:mm:ss.dd'
  93.     mov    ah,9                ;display string
  94.     int    21H
  95.  
  96.     pop    ax                ;restore EXEC program errors
  97.     mov    ah,4CH                ;terminate process
  98.     int    21H
  99. Timer    endp
  100.  
  101.  
  102. TimeStuff    proc    near
  103.  
  104. End_Time:
  105.     mov    ah,2CH                ;get current time
  106.     int    21H
  107. ;    mov    bl,deci                ;old decisecond
  108. ;    mov    bh,sec                ;old seconds
  109.     mov    bx,startDX            ;BL=deci,BH=sec
  110.     mov    ah,60                ;constant
  111.     mov    al,dl                ;get fraction
  112.     sub    al,bl                ;deci = dl-old deci
  113.     jnb    S1                ;no carry, so not <0
  114.      add    al,100                ;<0, adjust
  115.      inc    bh                ;bump old seconds
  116. S1:    mov    dl,al                ;save adj. deci
  117.  
  118.     mov    bl,min                ;get old Minute
  119.     mov    al,dh                ;get new seconds
  120.     sub    al,bh                ;sec = new sec-old sec
  121.     jnb    S2                ;not <0
  122.      add    al,ah                ;<0, add back 60
  123.      inc    bl                ;old min=old min+1
  124.      jmp    short S3
  125.  
  126. S2:    cmp    al,ah                ;>=60?
  127.     jb    S3                ; nope
  128.      sub    al,ah                ; sec=sec-60
  129.      dec    bl                ;old min=old min-1
  130. S3:    mov    dh,al                ;save adj. seconds
  131.  
  132.     mov    bh,hour                ;old hour
  133.     mov    al,cl                ;get new minutes
  134.     sub    al,bl                ;min=new min-old min
  135.     jnb    S4                ; not below 0
  136.      add    al,ah                ;min=min+60
  137.      inc    bh                ;old hour=old hour+1
  138.      jmp    short S5
  139.  
  140. S4:    cmp    al,ah                ;>=60?
  141.     jb    S5                ; nope
  142.      sub    al,ah                ;min=min-60
  143.      dec    bh                ;old hour=old hour-1
  144. S5:    mov    cl,al                ;save adj. minutes
  145.  
  146.     mov    al,ch                ;get new hour
  147.     sub    al,bh                ;hour=new hour-old hour
  148.     mov    ch,al
  149.  
  150. ;We now have the time difference in CX and DX.
  151. ;Jump to stuff them into our time string and return.
  152.     jmp    short Stuff_Time
  153.  
  154. Start_Time:
  155.     mov    ah,2CH                ;DOS get time svc
  156.     int    21H
  157. ;    mov    hour,ch                ;update globals
  158. ;    mov    min,cl
  159.     mov    startCX,cx            ;CL=min,CH=hour
  160. ;    mov    sec,dh
  161. ;    mov    deci,dl
  162.     mov    startDX,dx            ;DL=deci,DH=sec
  163. ;We have the start time in CX and DX.
  164. ; fall through to Stuff_Time and return
  165.  
  166. Stuff_Time:
  167. ;common procedure .. stuff time values in CX and DX
  168. ; into our time buffer (ASCII characters)
  169.     mov    di,offset timebuff        ;ES:DI
  170.  
  171.     xor    ax,ax                ;insure msb is clear
  172.     mov    bl,10                ;div by 10
  173.     mov    al,ch                ;hours
  174.     mov    bh,':'                ;separator after hrs
  175.     call    DoDiv
  176.  
  177.     mov    al,cl                ;minutes
  178.     call    DoDiv                ;still ':' after minutes
  179.  
  180.     mov    al,dh                ;seconds
  181.     mov    bh,'.'                ;decimal after seconds
  182.     call    DoDiv
  183.  
  184.     mov    al,dl                ;deci
  185.     xor    bh,bh                ;no divider
  186.     call    DoDiv
  187.     ret                    ;done
  188.  
  189. DoDiv:
  190.     or    ax,ax                ;divisor=0?
  191.     jz    NoDiv                ;yep
  192.      div    bl
  193. NoDiv:
  194. ;quotient (10's) in al, remainder in ah
  195.     add    ax,'00'                ;asciify
  196.     stosw
  197.     or    bh,bh                ;is it a zero?
  198.     je    NoSep                ; yep, no separator
  199.      mov    al,bh                ;our separator
  200.      stosb
  201. NoSep:
  202.     xor    ax,ax                ;clear msb again
  203.     ret
  204. TimeStuff    endp
  205.  
  206. startCX    label    word
  207. min        db    0        ;starting minutes
  208. hour        db    0        ;starting hours
  209. startDX    label    word
  210. deci        db    0        ;starting decisecs
  211. sec        db    0        ;starting seconds
  212.  
  213. StartMsg    db    'Start: $'
  214. EndMsg        db    'End: '
  215. TimeBuff    db    '00:00:00.00'
  216.         db    CR,LF,'$'
  217.  
  218. savess    DW    ?                ; Holders for SS:SP
  219. savesp    DW    ?
  220.  
  221. filenam    DB    'C:\COMMAND.COM',0        ; Assume COMMAND.COM on C:
  222.  
  223.     Even                    ;TH for faster access?
  224.  
  225. parmblk    DW    00                ; Parameter block
  226.     DW    OFFSET comline,00
  227.     DW    5CH,00
  228.     DW    6CH,00
  229.  
  230. ;TH default is just COMMAND.COM
  231. comline    db    17                ;TH default cmd length
  232.     db    '/C C:\COMMAND.COM',CR        ;TH default: Exec COMMAND.COM
  233.  
  234. COMLEN    =    $ - offset comline        ;TH
  235.  
  236.     db    128-comlen DUP(0)        ;TH up to 128 bytes
  237.  
  238.     DB    128  DUP (?)            ; Stack
  239. stack    LABEL    BYTE
  240.  
  241. lastloc    LABEL    BYTE                ; End of program
  242.  
  243. CSeg    ENDS
  244.     END    Timer
  245.