home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol090 / spause.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  2.8 KB  |  124 lines

  1. ;
  2. ; SYSLIB Module Name:  SPAUSE
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  2.0
  5. ; Module Version Number:  1.0
  6. ; Module Entry Points:
  7. ;    PAUSE
  8. ; Module External References:
  9. ;    None
  10. ;
  11.  
  12. ;
  13. ;  PAUSE -- Pause N 10ths of a Second
  14. ;    PAUSE will simply enter a delay loop for N 10ths of a Second.
  15. ;
  16. ;    Input Parameters:  HL = Number of 10ths of a Second to Pause
  17. ;            B = Processor CLock Speed (in MHz)
  18. ;    Output Parameters:  None
  19. ;    Registers Affected:  None
  20. ;    SYSLIB Routines Called:  None
  21. ;    Special Error Conditions:  None
  22. ;
  23.  
  24. ;
  25. ;  EQUATES
  26. ;
  27. BOOT    EQU    0    ; WARM BOOT ADDRESS
  28. CS$OFF    EQU    6    ; CONSOLE STATUS OFFSET
  29. CIN$OFF    EQU    9    ; CONSOLE INPUT OFFSET
  30.  
  31. ;
  32. ;  PAUSE ROUTINE
  33. ;    HL = N 10THS OF A SEC, B = PROCESSOR SPEED
  34. ;
  35. ;  COMPUTATION OF TIME DELAY CONSTANT:
  36. ;    INITIAL OVERHEAD    49 CYCLES
  37. ;    TERMINATING OVERHEAD    50 CYCLES
  38. ;    PROCESSOR SPEED (P)    (10+15)*P CYCLES
  39. ;    MAJOR OVERHEAD        TIME*132 CYCLES
  40. ;    N-COUNT OVERHEAD    (5+24)*N CYCLES
  41. ;    ** REQUIRED TOTAL **    100,000 CYCLES (1/10 SEC AT P=1)
  42. ;
  43. ;  SINCE THIS IS A GUESTIMATE ANYWAY AND PROCESSOR SPEED WILL NOT BE EXACTLY
  44. ;  P MHZ, I WILL THROW OUT THE PROCESSOR SPEED DELAY (AT MOST 100 CYCLES)
  45. ;
  46. ;  CALCULATIONS:  100,000 = 49 + 50 + TIME*132 + 29*N
  47. ;        TIME = (100,000 - 49 - 50 - 29*N)/132
  48. ;        TIME = (99,901 - 29*N)/132
  49. ;  CHART:
  50. ;         N    TIME
  51. ;          1     757    1/10 SEC
  52. ;          2     756
  53. ;          3     756
  54. ;          4     756
  55. ;          5     756    1/2 SEC
  56. ;         10     755    1 SEC
  57. ;         15     754
  58. ;         20     752    2 SECS
  59. ;         25     751
  60. ;         50     746    5 SECS
  61. ;        100     735    10 SECS
  62. ;        500     647    50 SECS
  63. ;
  64. ;  SINCE MOST CALLS TO THIS ROUTINE WILL REQUIRE BETWEEN 1/10 AND 5 SECS,
  65. ;  I SHALL SELECT AN "AVERAGE" TIME CONSTANT OF (757+746)/2 = 752
  66. ;  SINCE AN "AVERAGE" CLOCK IS 2+ OR 4+ MHZ, I SHALL FUDGE THIS (THRU PRACTICE)
  67. ;  TO 740
  68. ;
  69. TIME    EQU    700    ; TIME CONSTANT
  70. PAUSE::
  71.     PUSH    H    ; SAVE REGS [4*11 = 44]
  72.     PUSH    D
  73.     PUSH    B
  74.     PUSH    PSW
  75.     MOV    C,B    ; SAVE PROCESSOR SPEED IN C [5]
  76. ;
  77. ;  THE ABOVE INSTRUCTIONS REPRESENT THE INITIAL OVERHEAD = 49 CYCLES
  78. ;
  79. PAUSL:
  80.     MOV    B,C    ; GET PROCESSOR SPEED [5]
  81. PAUSL1:
  82.     LXI    D,TIME    ; GET DELAY CONSTANT [10]
  83. ;
  84. ;  THE ABOVE INSTRUCTIONS REPRESENT PART OF THE PROCESSOR SPEED OVERHEAD = 15
  85. ;
  86. PAUSL2:
  87.     XTHL        ; LONG INSTRUCTION FOR DELAY [6*18 = 108]
  88.     XTHL
  89.     XTHL
  90.     XTHL
  91.     XTHL
  92.     XTHL
  93.     DCX    D    ; COUNT DOWN INNER-MOST LOOP [5]
  94.     MOV    A,D    ; DONE?    [5]
  95.     ORA    E    ; [4]
  96.     JNZ    PAUSL2    ; [10]
  97. ;
  98. ;  THE ABOVE INSTRUCTIONS REPRESENT THE MAJOR OVERHEAD = TIME*(108+5+5+4+10)
  99. ;    = TIME*132
  100. ;
  101.     DCR    B    ; COUNT DOWN 10TH-SEC LOOP [5]
  102.     JNZ    PAUSL1    ; [10]
  103. ;
  104. ;  THE ABOVE INSTRUCTIONS REPRESENT THE REST OF THE PROCESSOR SPEED OVERHEAD
  105. ;    = 15
  106. ;
  107.     DCX    H    ; COUNT DOWN N 10THS LOOP [5]
  108.     MOV    A,H    ; DONE? [5]
  109.     ORA    L    ; [4]
  110.     JNZ    PAUSL    ; [10]
  111. ;
  112. ;  THE ABOVE INSTRUCTIONS REPRESENT THE N-COUNT OVERHEAD = 24 CYCLES
  113. ;
  114.     POP    PSW    ; RESTORE REGS [4*10 = 40]
  115.     POP    B
  116.     POP    D
  117.     POP    H
  118.     RET        ; [10]
  119. ;
  120. ;  THE ABOVE INSTRUCTIONS REPRESENT THE TERMINATING OVERHEAD = 50 CYCLES
  121. ;
  122.  
  123.     END
  124.