;
; SYSLIB Module Name:  SPAUSE
; Author:  Richard Conn
; SYSLIB Version Number:  2.0
; Module Version Number:  1.0
; Module Entry Points:
;       PAUSE
; Module External References:
;       None
;

;
;  PAUSE -- Pause N 10ths of a Second
;       PAUSE will simply enter a delay loop for N 10ths of a Second.
;
;       Input Parameters:  HL = Number of 10ths of a Second to Pause
;                       B = Processor CLock Speed (in MHz)
;       Output Parameters:  None
;       Registers Affected:  None
;       SYSLIB Routines Called:  None
;       Special Error Conditions:  None
;

;
;  EQUATES
;
BOOT    EQU     0       ; WARM BOOT ADDRESS
CS$OFF  EQU     6       ; CONSOLE STATUS OFFSET
CIN$OFF EQU     9       ; CONSOLE INPUT OFFSET

;
;  PAUSE ROUTINE
;       HL = N 10THS OF A SEC, B = PROCESSOR SPEED
;
;  COMPUTATION OF TIME DELAY CONSTANT:
;       INITIAL OVERHEAD        49 CYCLES
;       TERMINATING OVERHEAD    50 CYCLES
;       PROCESSOR SPEED (P)     (10+15)*P CYCLES
;       MAJOR OVERHEAD          TIME*132 CYCLES
;       N-COUNT OVERHEAD        (5+24)*N CYCLES
;       ** REQUIRED TOTAL **    100,000 CYCLES (1/10 SEC AT P=1)
;
;  SINCE THIS IS A GUESTIMATE ANYWAY AND PROCESSOR SPEED WILL NOT BE EXACTLY
;  P MHZ, I WILL THROW OUT THE PROCESSOR SPEED DELAY (AT MOST 100 CYCLES)
;
;  CALCULATIONS:  100,000 = 49 + 50 + TIME*132 + 29*N
;               TIME = (100,000 - 49 - 50 - 29*N)/132
;               TIME = (99,901 - 29*N)/132
;  CHART:
;                N      TIME
;                 1      757    1/10 SEC
;                 2      756
;                 3      756
;                 4      756
;                 5      756    1/2 SEC
;                10      755    1 SEC
;                15      754
;                20      752    2 SECS
;                25      751
;                50      746    5 SECS
;               100      735    10 SECS
;               500      647    50 SECS
;
;  SINCE MOST CALLS TO THIS ROUTINE WILL REQUIRE BETWEEN 1/10 AND 5 SECS,
;  I SHALL SELECT AN "AVERAGE" TIME CONSTANT OF (757+746)/2 = 752
;  SINCE AN "AVERAGE" CLOCK IS 2+ OR 4+ MHZ, I SHALL FUDGE THIS (THRU PRACTICE)
;  TO 740
;
TIME    EQU     700     ; TIME CONSTANT
PAUSE::
       PUSH    H       ; SAVE REGS [4*11 = 44]
       PUSH    D
       PUSH    B
       PUSH    PSW
       MOV     C,B     ; SAVE PROCESSOR SPEED IN C [5]
;
;  THE ABOVE INSTRUCTIONS REPRESENT THE INITIAL OVERHEAD = 49 CYCLES
;
PAUSL:
       MOV     B,C     ; GET PROCESSOR SPEED [5]
PAUSL1:
       LXI     D,TIME  ; GET DELAY CONSTANT [10]
;
;  THE ABOVE INSTRUCTIONS REPRESENT PART OF THE PROCESSOR SPEED OVERHEAD = 15
;
PAUSL2:
       XTHL            ; LONG INSTRUCTION FOR DELAY [6*18 = 108]
       XTHL
       XTHL
       XTHL
       XTHL
       XTHL
       DCX     D       ; COUNT DOWN INNER-MOST LOOP [5]
       MOV     A,D     ; DONE? [5]
       ORA     E       ; [4]
       JNZ     PAUSL2  ; [10]
;
;  THE ABOVE INSTRUCTIONS REPRESENT THE MAJOR OVERHEAD = TIME*(108+5+5+4+10)
;       = TIME*132
;
       DCR     B       ; COUNT DOWN 10TH-SEC LOOP [5]
       JNZ     PAUSL1  ; [10]
;
;  THE ABOVE INSTRUCTIONS REPRESENT THE REST OF THE PROCESSOR SPEED OVERHEAD
;       = 15
;
       DCX     H       ; COUNT DOWN N 10THS LOOP [5]
       MOV     A,H     ; DONE? [5]
       ORA     L       ; [4]
       JNZ     PAUSL   ; [10]
;
;  THE ABOVE INSTRUCTIONS REPRESENT THE N-COUNT OVERHEAD = 24 CYCLES
;
       POP     PSW     ; RESTORE REGS [4*10 = 40]
       POP     B
       POP     D
       POP     H
       RET             ; [10]
;
;  THE ABOVE INSTRUCTIONS REPRESENT THE TERMINATING OVERHEAD = 50 CYCLES
;

       END