home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / xbase / library / clipper / progr_ba / timentxa.asm < prev    next >
Assembly Source File  |  1992-02-28  |  10KB  |  282 lines

  1. ;-----------------------------------------------------------------------------
  2. ;
  3. ;  STATUS version 1.01
  4. ;  (c) 1992 John T. Opincar, Jr.
  5. ;  CID: 71631,541
  6. ;  02/27/92 
  7. ;
  8. ;  PLEASE READ THIS!
  9. ;                                      
  10. ;  You are free to distribute STATUS in any manner you choose and use STATUS
  11. ;  in any setting, including commercial without any obligation to me.  The
  12. ;  only thing that I ask is that you do not distribute modified versions of
  13. ;  STATUS without including the original code and documentation in its
  14. ;  entirety.  If you feel inclined to distribute STATUS with your own 
  15. ;  modifications (which I would discourage), ***PLEASE*** keep your changes
  16. ;  in seperate files, and make the seperation and changes obvious to anyone
  17. ;  who might subsequently encounter the ZIP.
  18. ;
  19. ;  I have been informally supporting STATUS on CIS, and do not want a zillion
  20. ;  messages about problems introduced by others.  In lieu of making your own
  21. ;  changes, I would prefer that you send me mail describing the additional
  22. ;  features you would like to see in STATUS.  The exceptional performance
  23. ;  gains yielded by STATUS are the result of several key assumptions about 
  24. ;  how it will be used.  Before making a suggestion, please read the section
  25. ;  in the documentation entitled, "What Makes STATUS Tick." The main 
  26. ;  motivation behind this version of STATUS was input I received from users.
  27. ;
  28. ;-----------------------------------------------------------------------------
  29.  
  30. DOSSEG
  31. .MODEL      LARGE
  32.  
  33. PUBLIC      _barOffset, _barChar, _barColor, _barActive
  34. PUBLIC      _numOffset, _numColor, _numActive
  35. PUBLIC      _ticks, _isColor, _active, _lastRec, _recnoPtr
  36. PUBLIC      _timeron, _timeroff
  37.  
  38. EXTRN       __aFldiv:FAR        ;MS C runtime library routine for dividing longs
  39. EXTRN       setint:FAR          ;see ints.asm
  40.  
  41. .DATA
  42. _barOffset  dw      0           ;offset into video memory for bar display
  43. _barChar    dw      176         ;character to be used for bar display
  44. _barColor   dw      7           ;color attribute for bar display
  45. _barActive  dw      1           ;non-zero if bar display is to be used
  46.  
  47. _numOffset  dw      160         ;offset into video memory for number display
  48. _numColor   dw      7           ;color attribute for number display
  49. _numActive  dw      1           ;non-zero if number display is to be used
  50.  
  51. _ticks      dw      18          ;number of timer ticks between display updates
  52. _isColor    dw      1           ;non-zero if color monitor present
  53. _active     dw      0           ;non-zero if display is active
  54. _lastRec    dd      1           ;number of records in the database
  55. _recnoPtr   dd      0           ;pointer to the current record #
  56.  
  57. installed   dw      0           ;non-zero if timer isr has been installed
  58. tickcount   dw      0           ;number of ticks until next display update
  59. lastPercent dw      0           ;0 <= lastPercent <=50, last displayed percent
  60. old8h       dw      2 dup(0)    ;old timer interrupt vector
  61.  
  62. .CODE
  63.  
  64. ;----------------------------------_TIMERON-------------------------------------
  65.  
  66. ;PURPOSE: Initializes progress display.  Installs timer routine if not yet
  67. ;         installed
  68.  
  69. _timeron    proc    far
  70.             cmp     installed,0         ;see if timer routine installed
  71.             jne     setactive
  72.  
  73.             mov     ax,SEG timerctrl    ;install timer int
  74.             push    ax
  75.             mov     ax,OFFSET timerctrl
  76.             push    ax
  77.             mov     ax,08h
  78.             push    ax
  79.             call    SETINT
  80.             add     sp,6
  81.             mov     old8h[0],ax         ;save old timer interrupt vector
  82.             mov     old8h[2],dx
  83.             mov     installed,1
  84.  
  85. setactive:  mov     bx,0b000h           ;load proper video segment
  86.             cmp     _isColor,0
  87.             je      notcolor3
  88.             mov     bx,0b800h
  89. notcolor3:  mov     es,bx
  90.  
  91.             mov     di,_numOffset
  92.             add     di,4
  93.             mov     ax,_numColor
  94.             mov     BYTE PTR es:[di],'0'        ;show 0 percent
  95.             mov     es:[di + 1],al
  96.  
  97.             mov     ax,_ticks
  98.             mov     tickcount,ax
  99.             mov     lastPercent,0
  100.             mov     _active,1
  101.             ret
  102. _timeron    ENDP
  103.  
  104. ;---------------------------------_TIMEROFF-------------------------------------
  105.  
  106. ;PURPOSE: Turns of progress display.
  107.  
  108. _timeroff   proc    far
  109.             push    es
  110.             push    di
  111.  
  112.             mov     _active,0           ;disable progress display
  113.  
  114.             mov     bx,0b000h           ;load proper video segment
  115.             cmp     _isColor,0
  116.             je      notcolor2
  117.             mov     bx,0b800h
  118. notcolor2:  mov     es,bx
  119.  
  120.             cmp     _barActive,0        ;is bar active?
  121.             je      noBar
  122.  
  123.             mov     ax,50               ;fill in complete bar
  124.             mov     di,_barOffset
  125.             mov     bx,_barChar
  126.             mov     cx,_barColor
  127.             mov     bh,cl
  128. bloop:      mov     es:[di],bx
  129.             add     di,2
  130.             dec     ax
  131.             jnz     bloop
  132.             
  133. noBar:      cmp     _numActive,0        ;is number active?
  134.             je      offDone
  135.  
  136.             mov     di,_numOffset
  137.             mov     ax,_numColor
  138.             mov     BYTE PTR es:[di],'1'        ;show 100 percent
  139.             mov     es:[di + 1],al
  140.             mov     BYTE PTR es:[di + 2],'0'
  141.             mov     es:[di + 3],al
  142.             mov     BYTE PTR es:[di + 4],'0'
  143.             mov     es:[di + 5],al
  144.  
  145. offdone:    pop     di
  146.             pop     es
  147.             ret
  148. _timeroff   ENDP
  149.  
  150. ;----------------------------------TIMERCTRL-------------------------------------
  151.  
  152. oldtimer    label   dword
  153. cs_old8h    dw      2 dup(?)
  154.  
  155. TIMERCTRL   proc    far
  156.             pushf
  157.             push    ds
  158.  
  159.             push    cx                  ;load old timer address into code seg
  160.             mov     cx,DGROUP
  161.             mov     ds,cx
  162.             assume  ds:DGROUP
  163.             mov     cx,old8h
  164.             mov     cs:cs_old8h,cx
  165.             mov     cx,old8h[2]
  166.             mov     cs:cs_old8h[2],cx
  167.             pop     cx
  168.  
  169.             cmp     _active,0           ;see if we're active
  170.             jne     decrement
  171.             jmp     calloldtime
  172.  
  173. decrement:  dec     tickcount           ;check for need to update display
  174.             jz      rollover
  175.             jmp     calloldtime
  176.  
  177. rollover:   push    ax
  178.             push    bx
  179.             push    cx
  180.             push    dx
  181.             push    si
  182.             push    di
  183.             push    es
  184.  
  185.             mov     ax,_ticks           ;reset tickcount
  186.             mov     tickcount,ax
  187.  
  188.             les     si,_recnoPtr
  189.             mov     ax,es:[si]
  190.             add     si,2
  191.             mov     dx,es:[si]
  192.  
  193.             shl     ax,1                ;ax:dx = (recno() * 50), uses shift-add
  194.             rcl     dx,1                ;technique to avoid long multiply
  195.             mov     bx,ax
  196.             mov     cx,dx
  197.             shl     ax,1
  198.             rcl     dx,1
  199.             shl     ax,1
  200.             rcl     dx,1
  201.             shl     ax,1
  202.             rcl     dx,1
  203.             add     bx,ax
  204.             adc     cx,dx
  205.             shl     ax,1
  206.             rcl     dx,1
  207.             add     ax,bx
  208.             adc     dx,cx
  209.  
  210.             mov     bx,WORD PTR _lastRec[2]     ;load up for call to long div
  211.             push    bx
  212.             mov     bx,WORD PTR _lastRec[0]
  213.             push    bx
  214.             push    dx
  215.             push    ax
  216.             call    FAR PTR __aFldiv            ;note, no stack clean up needed
  217.                                                 ;here.  Very strange.
  218.  
  219.             mov     cx,ax                       ;see if we really need to
  220.             sub     ax,lastPercent              ;update display
  221.             jbe     restoreregs
  222.  
  223.             push    cx
  224.             mov     bx,0b000h           ;load video segment
  225.             cmp     _isColor,0
  226.             je      notcolor
  227.             mov     bx,0b800h
  228. notcolor:   mov     es,bx
  229.  
  230.             cmp     _barActive,0        ;is bar display active?
  231.             je      noBar2
  232.  
  233.             mov     bx,_barChar         ;fill in bar extension from last call
  234.             mov     cx,_barColor
  235.             mov     bh,cl
  236.             mov     di,_barOffset
  237.             add     di,lastPercent
  238.             add     di,lastPercent
  239. barloop:    mov     es:[di],bx
  240.             add     di,2
  241.             dec     ax
  242.             jnz     barloop
  243.  
  244. noBar2:     cmp     _numActive,0        ;is number active?
  245.             je      storelp
  246.  
  247.             pop     ax                  ;display progress as percent number
  248.             push    ax
  249.             shl     ax,1
  250.             mov     di,_numOffset
  251.             add     di,4
  252.             mov     bx,10
  253.             mov     cx,_numColor
  254.  
  255. numloop:    cmp     ax,0
  256.             je      storelp
  257.             div     bl
  258.             add     ah,48
  259.             mov     es:[di],ah   
  260.             mov     es:[di + 1],cl
  261.             sub     ah,ah
  262.             sub     di,2
  263.             jmp     numloop
  264.  
  265. storelp:    pop     cx                  ;set lastPercent to current position
  266.             mov     lastPercent,cx
  267.  
  268. restoreregs:pop     es
  269.             pop     di
  270.             pop     si
  271.             pop     dx
  272.             pop     cx
  273.             pop     bx
  274.             pop     ax
  275.  
  276. calloldtime:pop     ds                  ;jump to old timer routine
  277.             popf
  278.             assume  ds:nothing
  279.             jmp     oldtimer
  280. TIMERCTRL   ENDP
  281.             END
  282.