home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / BBS_UTIL / BM0406_A.ZIP / BMASM.ZIP / GIVEBK41.ASM < prev    next >
Assembly Source File  |  1993-10-29  |  17KB  |  315 lines

  1. page 88,132
  2. Comment ~
  3.              GIVEBACK (Version 4.1) Description and Source Code
  4.  
  5.         Kurt Riegel, 3019 North Oakland Street, Arlington, VA 22207
  6.         ASTRO Bulletin Board, data 202-524-1837, voice 703-522-5427
  7.  
  8.  
  9. (The description below is cast in terms of using GIVEBACK under OS/2 v2.x,
  10. DESQview or DoubleDos, in conjunction with the bulletin board program RBBS-PC,
  11. but the same procedure is usable from ANY calling program, for example using
  12. CALL GIVEBACK in compiled BASIC.)
  13.  
  14. This small assembly language routine follows information provided in the
  15. DESQview (DV) 2.01 manual, and in the DoubleDos (DD) 4.0 manual.
  16.  
  17. The idea is simple, but powerful.  DESQview kindly terminates processing in a
  18. window if the computer pauses for a standard dos keyboard function, saving the
  19. rest of the time slice for jobs in other windows.  But in other kinds of loops,
  20. for example the loop in RBBS bulletin board which watches for the telephone to
  21. ring, lots of time is wasted, uselessly looking for a phone ring every few
  22. milliseconds.  Once a second would be quite enough!
  23.  
  24. By calling this routine from the end of a wasteful loop in a program, DESQview
  25. will be forced to "give back" the rest of the time in that time slice, that is,
  26. you will execute the loop only once per time slice rather than many times.
  27. This greatly speeds up jobs in the other DV windows, without affecting the
  28. calling program at all.
  29.  
  30. The most wasteful RBBS task is waiting for the telephone to ring; another is
  31. waiting for the user to select a command and hit the Return key.  So we CALL
  32. this procedure at the end of these loops.  The table below summarizes actual
  33. measurements made with DV on an AST Premium 286 (10 MHz, zero wait state),
  34. relative to speed on the same machine without DV, running a single job.  DV
  35. SETUP default performance settings were 9 slices foreground, 3 slices
  36. background.  This improvement would be larger and MUCH more noticeable on a
  37. slower machine.
  38.  
  39. Similarly, DoubleDos normally allocates two thirds of the computing cycles to
  40. the Visible task, and the remaining third to the Invisible task (plenty for
  41. the RBBS bulletin board).  The loss of cycles is sometimes noticeable, and this
  42. reclaims them when not really needed by RBBS.  You can even use this to speed
  43. up both nodes of RBBS, when one is in the Visible section and the other is in
  44. the Invisible section (you would probably choose PRIORITY=EQUAL with 2 nodes).
  45. DD version 4.00 has a special interrupt that allows the programmer to "give
  46. back" up to 255 time slices of duration 55 milliseconds each.  This procedure
  47. gives back 6 slices, about a third of a second at the old 4.77 MHz clock rate.
  48.                         
  49. The table below summarizes actual speed measurements with and without
  50. GIVEBACK, running under both DoubleDos and DESQview.  The speedup is
  51. wonderful, about 65%.  Once you use it, you'll never go back.
  52.  
  53.                         
  54.         Non-bbs speed   │  Waiting for Ring  │  Caller On
  55.         ────────────────┼────────────────────┼──────────────────────
  56. DV:     Unmodified      │        74%         │    74%              
  57.         With GIVEBACK   │        98%         │ variable, average 86%   
  58.         ────────────────┼────────────────────┼──────────────────────
  59. DD:     Unmodified      │        57%         │    57%              
  60.         With GIVEBACK   │        94%         │ variable, average 80%   
  61.         ────────────────┴────────────────────┴──────────────────────
  62.  
  63. Challenge for multitasking RBBS enthusiasts:  There are additional wasteful
  64. loops in RBBS--put on your best Sherlock outfit, and go snooping for places to
  65. CALL GIVEBACK.  Please keep in touch with me on your progress through the
  66. telephone numbers or address posted at the top of this file.
  67.  
  68.  
  69.                            ┌─────────────────────┐                          
  70.                            │     RBBS 17.4       │
  71. ┌──────────────────────────┴─────────────────────┴─────────────────────────┐
  72. │   Starting with version 17.4, RBBS is now being run by many SysOps in    │
  73. │   OS/2 boxes.  Since RBBS can't detect OS/2 at this point, I figured     │
  74. │   I'd add a detect routine and call the OS/2 time slice routine to give  │
  75. │   up time in the DOS VDM.                                                │
  76. │                                                                          │
  77. │   Modifications by Richie Molinelli on 08/03/93 & 10/29/93               │
  78. └──────────────────────────────────────────────────────────────────────────┘
  79.  
  80.  
  81.                            ┌─────────────────────┐                          
  82.                            │     RBBS 16.1       │
  83. ┌──────────────────────────┴─────────────────────┴─────────────────────────┐
  84. │   Starting with version 16.1, RBBS has the implementation for GIVEBACK   │
  85. │   already built in.  The original release version omitted one call,      │
  86. │   the one within the loop waiting for the telephone to ring.  It is      │
  87. │   repaired by making the small change below in RBBSSUB2.BAS              │
  88. │                                                                          │
  89. │  270 . . .                                                               │
  90. │      call giveback:WEND                                                  │
  91. │                                                                          │
  92. │    Then compile the modified RBBSSUB2.BAS, and LINK  RBBSSUB2.OBJ        │
  93. │    together with  GIVEBK31.OBJ and the rest of the normal RBBS  OBJect   │
  94. │    files package.                                                        │
  95. └──────────────────────────────────────────────────────────────────────────┘
  96.  
  97.  
  98.                                                                             
  99.                            ┌─────────────────────┐                          
  100.                            │    RBBS 15.1c       │                          
  101. ┌──────────────────────────┴─────────────────────┴─────────────────────────┐
  102. │    To implement GIVEBACK, modify RBBSSUB1.BAS by the addition of the     │
  103. │    lower case letter portion) in 2 lines only:                           │
  104. │                                                                          │
  105. │  270 IF RECYCLE.WAIT > 0 THEN _                              ' CPC15-1C  │
  106. │      IF TI! > INACTIVE.DELAY! THEN _                         ' CPC15-1C  │
  107. │      SUBROUTINE.PARAMETER = 8 : _                            ' CPC15-1C  │
  108. │      EXIT SUB                                                ' CPC15-1C  │
  109. │      call giveback:WEND                                                  │
  110. │      . . .                                                               │
  111. │ 1526 Y$ = KEY.PRESSED$                                                   │
  112. │      IF Y$ <> "" THEN _                                                  │
  113. │      GOTO 1545                                                           │
  114. │      call giveback:GOTO 1525                                             │
  115. │                                                                          │
  116. │    Then compile the modified RBBSSUB1.BAS, and LINK  RBBSSUB1.OBJ        │
  117. │    together with  GIVEBK31.OBJ and the rest of the normal RBBS  OBJect   │
  118. │    files package.                                                        │
  119. └──────────────────────────────────────────────────────────────────────────┘
  120.  
  121.                            ┌─────────────────────┐                          
  122.                            │    RBBS 14.1d       │                          
  123. ┌──────────────────────────┴─────────────────────┴─────────────────────────┐
  124. │    To implement GIVEBACK, modify RBBS-SUB.BAS version 14.1D (by the      │
  125. │    addition of the lower case letter portion) in 2 lines only:           │
  126. │                                                                          │
  127. │     270  call giveback : WEND                                            │
  128. │          . . .                                                           │
  129. │    1526  (actually, three lines after this line number . . .)            │
  130. │          call giveback : WEND                                            │
  131. │                                                                          │
  132. │    Then compile the modified RBBS-SUB.BAS, and LINK  RBBS-SUB.OBJ        │
  133. │    together with  GIVEBK31.OBJ and the rest of the normal RBBS  OBJect   │
  134. │    files package.                                                        │
  135. └──────────────────────────────────────────────────────────────────────────┘
  136.  
  137.  
  138.  
  139.  
  140. GIVEBACK Version history:
  141.  
  142.  1.0    December 1986 was the first version, for RBBS-PC v14.1D and DoubleDos
  143.         version 4.0
  144.  
  145.  1.2    January 2, 1987  Added a second call to giveback in the WHILE..WEND
  146.         loop which waits for user to enter a command.  DoubleDos only.
  147.  
  148.  1.3    May 20, 1987.  Changed to prevent RBBS modified with GIVEBACK from
  149.         crashing the system when run under naked Dos, that is, without the use
  150.         of DoubleDos.  Replaced direct INT FEh statement, with indirect AH=EEh,
  151.         followed by normal Dos function INT 21h.  DD and Dos obligingly work
  152.         together like this:  DD modifies the INT 21h function tables when it
  153.         starts so as to recognize EEh, and naked Dos ignores functions like EEh
  154.         which are unknown to it.  Possible caution--DD is definitely
  155.         non-standard in making this modification.  This should cause no
  156.         problem, UNLESS you use yet another non-standard program that also
  157.         grabs AH=EEh under INT 21h for another purpose (unlikely).
  158.  
  159. 2.0     Jan 1988.  Version is for DESQview 2.01  (works fine in 2.0 too),
  160.         together with RBBS 15.1c.  It does not supersede GIVEBK13,
  161.         required for operation under DoubleDos.  Although it duplicates some
  162.         lines of code found in RBBSDV.ASM, this is a simple, small, and cleanly
  163.         independent addition.  RBBS, modified to include this revision, will
  164.         work under naked DOS alone, or under DESQview.  (personal note--I run
  165.         only a single node, and prefer to drop all the FILELOCK, RBBSDV, and
  166.         multilink crap and related calls from my personal version of RBBS;
  167.         shrinks the .EXE file and makes it more reliable)
  168.  
  169. 3.0     Feb 1988.  This version consolidates DoubleDos and DESQview routines
  170.         into one that works equally well for RBBS running under either
  171.         multitasker, or under naked DOS.  Calling points are given for both
  172.         RBBS 14.1d and 15.1c.  My hope is that RBBS version 16.0 will
  173.         incorporate this into the release version.
  174.  
  175. 3.1     Apr 1988.  Minor upgrade neatens code and also eliminates the former
  176.         requirement for initializing GIVEBACK by calling GIVEINIT.  It can be
  177.         initialized explicitly as before; but if the user chooses to call
  178.         GIVEBACK straight away, then the initialization will be taken care of
  179.         automatically.
  180.  
  181. 4.0     Aug 1993.  Added detect of OS/2 v2.x and give back routine for time
  182.         Slices.  Richie Molinelli  08/03/93
  183.  
  184. 4.1     Oct 1993.  Check for OS/2 v2.x first since DESQview fooler program
  185.         (like OS2SPEED) may be running and we'll check and set to DV
  186.         accidentally.  Fixed minor mistake in code.
  187.         Richie Molinelli 10/29/93
  188.  
  189.  
  190. (End of comments here-you do not have to remove these comments to assemble.) ~
  191.  
  192.  
  193. GIVESEG SEGMENT 'CODE'
  194.         ASSUME  CS:GIVESEG
  195.         PUBLIC  GIVEINIT        ;the initialization routine, optional
  196.         PUBLIC  GIVEBACK    ;CALL GIVEBACK to give back time slice
  197.  
  198. MultiTasker  DB  -1     ; will indicate which multitasker is running, if any
  199.                         ;-1 means this hasn't yet been called, and
  200.                         ;    initialization is required using GIVEINIT
  201.                         ; 0 means no multitasker is present, only naked dos
  202.                         ; 1 means DESQview is running
  203.                         ; 2 means DoubleDos is running
  204.                         ; 3 means OS/2 v2.x                          ;RM080393
  205.  
  206. GIVEINIT PROC    FAR
  207.     PUSH    AX    ; save this stuff for safety
  208.         PUSH    BX
  209.         PUSH    CX
  210.         PUSH    DX
  211.         MOV     AH,030h          ; DOS get version                     RM080393/RM102993 Test for OS/2 first
  212.         INT     021h             ;                                     RM080393  since we may be running DV
  213.         CMP     AL,014h          ; looking for 20 decimal              RM080393  fooler program
  214.         JZ      OS2Here
  215.         JMP     DVTest           ; nope..not here so go on             RM080393
  216. OS2Here:
  217.         MOV     CS:MultiTasker,3 ;this indicates OS/2 v2.x present     RM080393
  218.         JMP     SHORT InitExit   ;                                     RM102993
  219. DVTest:
  220.         MOV     AX,2B01H                ; DV get version request, result to AX
  221.         MOV     CX,'DE'                 ; Illegal
  222.         MOV     DX,'SQ'                 ;        date, on purpose
  223.         INT     21H                     ; An error indicates DV isn't running
  224.         CMP     AL,0FFH                 ; Are we in DV?
  225.         JE      NO_DV                   ; Jump if not
  226.         MOV     CS:MultiTasker,1      ; 1 will mean DV is present
  227.         JMP     SHORT InitExit
  228. NO_DV:                ; DV isn't here, maybe DD is-let's check
  229.     MOV    AH,0E4h        ; function E4h tests for presence of DoubleDos
  230.     INT    21h          ; does nothing at all if DD not present
  231.     CMP    AL,01          ; 1 indicates DD present, program visible
  232.     JZ    DDhere
  233.     CMP    AL,02         ; 2 indicates DD present, program invisible
  234.     JZ    DDhere
  235.         JMP     NoMultitsk      ; anything else indicates not present, so quit
  236. DDhere: MOV    CS:MultiTasker,2    ;this value indicates DD present
  237.         JMP     SHORT InitExit
  238. NoMultitsk:
  239.         MOV     CS:MultiTasker,0        ;Neither DV,DD nor OS/2 running RM080393
  240. InitExit:
  241.         POP     DX                      ;and put it all back
  242.         POP     CX
  243.         POP     BX
  244.     POP    AX
  245.         RET
  246. GIVEINIT ENDP
  247.  
  248.  
  249. API_CALL PROC        ; local DV routine that goes on stack, does whatever
  250.     PUSH    AX    ;  call is passed in BX, then goes off stack
  251.         MOV     AX,101AH
  252.         INT     15H                     ; OSTACK
  253.         MOV     AX,BX
  254.         INT     15H                     ; Parameter
  255.         MOV     AX,1025H
  256.         INT     15H                     ; USTACK
  257.         POP     AX
  258.         RET
  259. API_CALL ENDP
  260.  
  261.  
  262. GIVEBACK PROC FAR       ;Gives up the rest of its time slice when called.
  263.                         ;GIVEINIT will be invoked automatically the first time
  264.                         ; that GIVEBACK is called; GIVEINIT can (optionally)
  265.                         ; be called explicitly to force initialization.
  266.         CMP     CS:MultiTasker,1        ;let's see what's running here
  267.         JZ      DVrunning               ;1 means DESQview is running
  268.         CMP     CS:MultiTasker,2        ;not DV so lets look further   RM080393
  269.         JZ      DDrunning               ;2 means DoubleDos is running  RM080393
  270. ;       JG      DDrunning               ;2 means DoubleDos is running
  271.         CMP     CS:MultiTasker,3        ;not DV or DD so lets look for OS/2 RM080393
  272.         JZ      OS2running              ;3 means OS/2 v2.x             RM080393
  273.         CMP     CS:MultiTasker,0        ;only naked Dos or uninitialized state
  274.                                         ;  remain as possibilities
  275.         JZ      GetOutaHere             ;0 means naked Dos
  276.         CALL    GIVEINIT                ;last remaining possibility is -1
  277.         JMP     GIVEBACK                ;after initializing, try this again
  278.  
  279. GetOutaHere:                            ;nothing else to do, so go back
  280.         RET
  281.  
  282. DVrunning:
  283.         PUSH    BX
  284.         MOV     BX,1000H                ; DV_PAUSE function call
  285.         CALL    API_CALL
  286.         POP     BX
  287.         JMP     SHORT GetOutaHere
  288.  
  289.  
  290. DDrunning:
  291.         push    bp      ;save caller's base pointer register
  292.         mov     bp,sp   ;setup to address off of base pointer register
  293.         push    ax      ;just in case this messes up something
  294.         mov     ax,0EE06h
  295.  
  296. Comment ~       EEh in AH is special DoubleDos giveback interrupt. 06h in AL is
  297. six 55ms giveback intervals = 1/3 sec.  ~
  298.  
  299.         int     21h     ;invokes special DoubleDos giveback interrupt
  300.         pop     ax      ;puts it back
  301.     POP    BP      ;restore callers base pointer register
  302.         JMP     SHORT GetOutaHere
  303.  
  304. OS2running:                                                            ;RM080393
  305.         PUSH    AX                                                     ;RM080393
  306.         MOV     AX, 01680h ; OS/2 2.x timeslice call                   ;RM080393
  307.         INT     02Fh                                                   ;RM080393
  308.         POP     AX                                                     ;RM080393
  309.         JMP     SHORT GetOutaHere                                      ;RM080393
  310.  
  311.  
  312. GIVEBACK ENDP
  313. GIVESEG  ENDS
  314.          END
  315.